c# - Linq 通过 List<T> (System.Collection.Generic.List) 对象过滤 IQueryable<T> (System.Data.Linq.DataQuery) 对象?

标签 c# asp.net-mvc linq-to-sql list iqueryable

我的 IQueryable 行是:

 // find all timesheets for this period - from db so System.Data.Linq.DataQuery
 var timesheets = _timesheetRepository.FindByPeriod(dte1, dte2);

我的列表行是:

 // get my team from AD - from active directory so System.Collection.Generic.List
 var adUsers = _adUserRepository.GetMyTeam(User.Identity.Name);

我希望只显示时间表集合中存在于用户集合中的那些用户的时间表。

如果我使用标准的 C# 表达式,例如:

 var teamsheets = from t in timesheets
                  join user in adUsers on t.User1.username equals user.fullname
                  select t;

我收到错误“不支持返回自引用常量表达式的 IQueryable”

有什么建议吗?

最佳答案

Linq to Sql 将尝试生成一个 sql 查询来表示整个表达式。这意味着它将尝试将广告用户集合作为参数传递给 sql 查询。如果用户太多,查询将达到参数限制 (2100),并且无法执行。如果一个团队中没有那么多用户,那么您可以使用一个 contains 表达式,它将在 sql 中转换为一个“IN”表达式。

这是史蒂文的建议:

string[] usernames = adUsers.Select(u => u.fullname).ToArray();

var teamsheets =
from t in timesheets
where usernames.Contains(t.User1.username)
select t;

以您尝试过的方式使用连接的唯一方法是将所有时间表从数据库检索到内存中(在时间表 var 上使用 ToList),然后连接将在内存中发生。如果这比使用 Contains 表现更好,或者您因为团队规模而无法使用 Contains,则可能值得考虑。

关于c# - Linq 通过 List<T> (System.Collection.Generic.List) 对象过滤 IQueryable<T> (System.Data.Linq.DataQuery) 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2666065/

相关文章:

c# - 将数据异步发送回 UI 线程

c# - 具有多种返回类型的方法

c# - asp.net core 3 MVC 上的模型绑定(bind)属性为 null

c# - 使用 LINQ to SQL 搜索字符串内的列表对象

c# - 如何简化多个构造函数?

c# - NavigationService.BackStack.FirstOrDefault() 不包含 Windows Phone 8 中的定义?

asp.net-mvc - 带有 ASP.NET MVC 的 HTML5

asp.net-mvc - Google Analytics-Universal Analytics代码可跟踪两种环境

c# - C#中的linq to List问题

c# - LinqToSql 中的 Xml 查询