2016-08-03 8 views
1

私はLINQの新機能で、いくつかのグループ名が '#'で区切られた 'Readers'という列を持つSQLビューをフィルタリングすることを検討しています(例:Administrators#HRグループ#従業員グループ ")。 ユーザーのグループのリストがあるため、ユーザーのグループの少なくとも1つが読者に含まれているすべてのレコードを抽出する必要があります。 つまり、ユーザーは彼に属するレコードのみを表示する必要があります。配列を比較するLINQクエリを作成する

私はこの解決策を見つけたが、私はそれが非常に非効率的だと思う:

private List<vwFax>getmyFaxes(List<string> myGroups) 
{ 
    var myFax = db.vwFax.AsQueryable(); 
    var res = db.vwFax.AsQueryable(); 
    List<vwFax> outRes= new List<vwFax>(); 

    foreach (string elem in myGroups) 
    { 
     res = (from a in myFax 
       where a.Readers.Contains(elem) 
       select a); 
     if(res.Count() > 0) 
     { 
      outRes.AddRange(res); 
     }    
    } 
    return outRes.ToList(); 
} 

任意のヘルプしてください?あなたは次のクエリで言っている基本的にはどのような

+0

outRes = from item in db.myFax where myGroups.Any(grp => item.Readers.Contains(grp)) select item; 
多分 '.ToList()' ' – haim770

+0

db.vwFax.AsQueryable()(a.Readers.Any(R => myGroups.Contains(R))は、Aを選択myFax中から)。 (x => myGroups.Any(y => x.Contains(y))。ToList(); LINQの代わりにストアドプロシージャを作成します。 – Valentin

+0

1つの大きなクエリを実行するのではなく、 'myGroups.Count'というSQLクエリを実行しているため、' if(res.Count()> 0){outRes.AddRange(res);} 'の問題があるようです。上記のLINQクエリを使用すると、1つのクエリのみが実行されます。 – Valentin

答えて

2

は次のとおりです。myFaxの各項目についてmyGroups

outRes = db.myFax.Where(item => myGroups.Any(grp => item.Readers.Contains(grp))); 

で、クエリ構文でAny(少なくとも1)の項目のそれはitem.Readersが含まれている場合にのみそれを取ります:

+0

ありがとうございました!それは魅力のように機能します! – ZambaX

+0

@ZambaX - あなたは歓迎です:) –