Linq lambda不起作用,但delegate起作用
本文关键字:delegate 起作用 lambda 不起作用 Linq | 更新日期: 2023-09-27 18:03:48
好吧,这是做我的头-我甚至不知道如何搜索这个
这是我函数的第一部分:
var rules = context.Rules.Include(r => r.CreatedBy).Include(r => r.ModifiedBy);
IUserManager um = GetUserManager();
var currentUser = um.GetCurrent();
谁能告诉我为什么这样做:
return rules.Where(delegate(Rule r)
{
return r.CreatedBy.CompanyID == currentUser.CompanyID;
});
但这不是:
return rules.Where(r => r.CreatedBy.CompanyID == currentUser.CompanyID);
- 首先是EF Code, CreatedBy和ModifiedBy都是虚拟属性。
- r。CreatedBy和currentUser都是同一个类的实例(如果你还没有弄清楚) 第二个代码片段返回的是一个空列表。这就好像急切加载不工作,lambda不会导致延迟加载。
var rules = context.Rules.Include(r => r.CreatedBy)
.Include(r => r.ModifiedBy).ToList()
则lambda有效。尽管如此,这个问题仍然存在。为什么我必须使用ToList()或者委托。我在同一类的其他地方做同样的事情,它的工作正如我所期望的。
谢谢
这是因为lambda可以隐式地转换为委托或表达式树。在第一种情况下,委托被转换为表达式树,因为rules
是IQueryable<>
,重载解析选择Queryable.Where
。但是,当您使用匿名函数时,不能将其转换为表达式树,因此重载解析必须选择Enumerable.Where
。
当你把规则变成List<>
时,强制重载解析选择Enumerable.Where
,因为List<>
不实现IQueryable<>
。您可以使用AsEnumerable()
来达到相同的效果,而无需创建列表的开销。
当你"在同一个类的其他地方做同样的事情,它像我期望的那样工作"时,为什么这不起作用,如果你给出一个有效的代码示例,我们可能能够帮助你。