gpt4 book ai didi

c# - 我可以在联接中使用委托(delegate)变量并获取 IQueryable 吗

转载 作者:太空宇宙 更新时间:2023-11-03 13:17:16 24 4
gpt4 key购买 nike

起源

我有一个 LINQ-to-SQL 查询,它会根据外部标准略有不同。我为三种不同的情况写了一个 switch 语句,但不同情况下的一系列查询几乎相同。唯一不同的是用于连接条件的委托(delegate)。

因此,为了使我的代码更简洁,我决定只使用 switch 语句从三个不同的委托(delegate)中进行选择。然后,我会将所选的委托(delegate)保存在一个变量中,并在 .Join 调用中使用该变量。

问题

但是,当我使用变量而不是显式键入委托(delegate)时,.Join 不再返回 IQueryable,而是返回 IEnumerable。我应该澄清一下,我是从 Intellisense 获取“var”关键字的返回值。

所以这个返回一个 IQueryable:

var dc = new CloudDataContext();
var manifests = dc.ShippingManifests.Join(
dc.Locations,
man => man.OriginId,
loc => loc.Id,
(man, loc) => man
);

但是这个返回一个 IEnumerable:

protected static int? ManifestOriginId( ShippingManifest manifest ) {
return manifest.OriginId;
}

Func<ShippingManifest, int?> originJoiner = GridModelManifests.ManifestOriginId;

var dc = new CloudDataContext();
var manifests = dc.ShippingManifests.Join(
dc.Locations,
originJoiner,
loc => loc.Id,
(man, loc) => man
);

问题

我很好奇为什么会这样,但我更好奇如何才能完成我想要完成的事情。我需要获得一个 IQueryable,因为生成的查询将向下传递以进行进一步操作。

最佳答案

尝试将其作为 Expression .

如果不是,查询可能会在连接之前被混合并拉入内存。你要找的是 Expression<Func<ShippingManifest, int?>> :

Expression<Func<ShippingManifest, int?>> originJoiner = man => man.OriginId;

这允许 Linq to SQL 中的表达式访问者在将它发送到数据库之前继续处理它。

关于c# - 我可以在联接中使用委托(delegate)变量并获取 IQueryable 吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25676309/

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