gpt4 book ai didi

c# - Linq lambda 不工作但委托(delegate)不工作

转载 作者:行者123 更新时间:2023-11-30 16:59:31 26 4
gpt4 key购买 nike

好的,这让我费尽心思 - 我什至不确定如何搜索它。

这是我的函数的第一部分:

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 代码,CreatedBy 和 ModifiedBy 都是虚拟属性。
  • r.CreatedBy 和 currentUser 都是同一个类的实例(如果您还没有解决这个问题)
  • 第二个片段返回的是一个空列表。好像预加载不起作用,lambda 不会导致延迟加载。

注意:我刚刚发现,如果我将第一行更改为

var rules = context.Rules.Include(r => r.CreatedBy)
.Include(r => r.ModifiedBy).ToList()

然后 lambda 起作用了。问题仍然存在。为什么我必须使用 ToList() 或委托(delegate)。我在同一个类(class)的其他地方做同样的事情,它的工作方式符合我的预期。

谢谢

最佳答案

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

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

至于当您“在同一个类(class)的其他地方做同样的事情并且它按我的预期工作”时,为什么这不起作用,如果您给出一个代码示例,我们可能会提供帮助工作。

关于c# - Linq lambda 不工作但委托(delegate)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23686548/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com