2016-08-03 26 views
1

我對LINQ很陌生,我正在過濾一個SQL視圖,該視圖有一個名爲'Readers'的列,該列包含由'#'分隔的多個組名(例如,Administrators#HR組#員工組「)。 有一個用戶組的列表,我需要提取所有記錄,其中讀者至少包含一個用戶組。換句話說,用戶只能看到屬於他的那些記錄。創建一個比較數組的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

也許'(從在myFax其中a.Readers.Any(R => myGroups.Contains(R))選擇一個).ToList()'' – haim770

+0

db.vwFax.AsQueryable()式。 (x => myGroups.Any(y => x.Contains(y))。ToList();'你也可以創建一個存儲過程而不是LINQ。 – Valentin

+0

看起來問題出在'if(res.Count()> 0){outRes.AddRange(res);}'因爲您正在執行SQL查詢'myGroups.Count'時,而不是執行一個大查詢。使用上面的LINQ查詢,您只會執行一個查詢。 – Valentin

回答

2

你說下面的查詢基本上是什麼:對於myFax每個項目採取只如果item.Readers包含Any(至少1)的項目中myGroups

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

和查詢語法:

outRes = from item in db.myFax 
     where myGroups.Any(grp => item.Readers.Contains(grp)) 
     select item; 
+0

非常感謝!它像一個魅力! – ZambaX

+0

@ZambaX - 不客氣:) –