2016-08-03 29 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 - 不客气:) –