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()或者委托。我在同一类的其他地方做同样的事情,它的工作正如我所期望的。

谢谢

Linq lambda不起作用,但delegate起作用

这是因为lambda可以隐式地转换为委托或表达式树。在第一种情况下,委托被转换为表达式树,因为rulesIQueryable<>,重载解析选择Queryable.Where。但是,当您使用匿名函数时,不能将其转换为表达式树,因此重载解析必须选择Enumerable.Where

当你把规则变成List<>时,强制重载解析选择Enumerable.Where,因为List<>不实现IQueryable<>。您可以使用AsEnumerable()来达到相同的效果,而无需创建列表的开销。

当你"在同一个类的其他地方做同样的事情,它像我期望的那样工作"时,为什么这不起作用,如果你给出一个有效的代码示例,我们可能能够帮助你。