2009-04-09 17 views
1

ADO.NETデータサービスを使用しており、クエリインターセプタで行レベルのセキュリティを実装して、ユーザーが見ることができるデータ。 ユーザーのユーザー名が別の表にあるという点で複雑です。だから、私は、ユーザーがそのユーザーのOnlineSubscriptionテーブルのエントリに応じて参照して、現在のイベントは次のように返されるすべてのエントリと一致するかどうかを返すことができるイベントのリストを取得すると考えていた:エンティティがADO.NETデータサービス内の項目のリスト内にある場合にtrueを返すようにクエリする

[QueryInterceptor("Events")] 
public Expression<Func<Events, bool>> QueryEvents() 
{ 

    var allowedEventList = (from os in context.OnlineSubscription 
          from e in os.Events 
         where os.UserName == HttpContext.Current.User.Identity.Name 
         select e; 

return e => events.Intersect(new List<Events> 
             { 
               e 
             }).Any(); 
} 

しかし、これは「実装されていない」例外をスローします。だから私の質問です:クエリインターセプタのエンティティのリストに現在のエンティティを比較する正しい方法はありますか?

編集:私も試してみた:

return e => events.Any(evnt => evnt.Event_Key == e.Event_Key); 

を任意の成功なしに(再び例外 "実装されていません" 取得します)。

答えて

2

明らかに、これは、ラムダ式events.Anyを使用することによって失敗します。これは、初期コンテキスト(つまり、イベントをまっすぐに照会)ですでにクエリを実行していて、events.Any節を追加すると、新しいコンテキスト(すなわち、OnlineSubscription内のイベントの入れ子になった「from」)は、わかりやすく例外をスローします。私はその後、使用

これはちょうど最初のクエリと同じコンテキストに照会し、単に関係を通じて横断しているので、作品
[QueryInterceptor("Events")] 
public Expression<Func<Events, bool>> QueryEvents() 
{  
    return e => e.OnlineSubscription.Any(os => os.UserName == HttpContext.Current.User.Identity.Name); 
} 

0

本当に?

[QueryInterceptor("Products")] 
public Expression<Func<Product, bool>> QueryProducts() 
{ 
    return p => p.User.Username == HttpContext.Current.User.Identity.Name; 
} 

私はProductオブジェクト自体のプロパティでフィルタする場合、それは正常に動作ではなく、それの関係のいずれかを介して:私はこのコードで例外を「実装されていません」取得しています。

+0

問題が見つかりました。それは次のようにする必要があります。 string user = HttpContext.Current.User.Identity.Name; return p => p.User.Username == user; 代わりに、それが動作します。私はそれがちょうどADO.NETデータエンティティモデルは、SQLにLinqが渡して渡されるパラメータとしてHttpContext参照を変換する方法を知らないためだと思います。 –

関連する問題