我的 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/