gpt4 book ai didi

c# - Linq2Sql 包含

转载 作者:太空宇宙 更新时间:2023-11-03 10:59:53 25 4
gpt4 key购买 nike

我有两个数据持有者列表。

IQueryable<myClass> aData and IQueryable<myClass> bData

两者都包含一个 LocationId我想删除 bData 中所有不是来自 aData 中 Locations 的实例。因此,如果位置 99 出现在 B 而不是 A,则将其删除。

所以我为此做的是

var validLocationIds = aData.Select(d => d.LocationId).Distinct();
var newBData = bData.Where(d=> validLocationIds.Contains(d.LocationId));

然后我合并 a 和 newB,将它们分组并获得我想要的值。这在某些时候工作得很好,但对于某些参数(用于构建 A 和 B)

我收到错误信息:

"Method 'Int32 Parse(System.String)' has no supported translation to SQL."

当我在 Distinct() 之后运行 ToList() 以获取 ValidLocationId 时,错误消息就消失了,但是我希望该方法只访问数据库一次。

我是否遗漏了一些有关 Contains 方法的信息?(ADataBData是同一个类,LocationId是一个int)

最佳答案

使用 d => Contains(d.LocationID) 大致翻译为 d.LocationId IN ( ... ),它不能在单个 SQL 参数中定义。这意味着它必须在客户端评估传递到 IN 子句的参数。这就是为什么如果您执行 .ToList() 以获取 validLocationIds,它会起作用。

如果您想在单个数据库查询中执行此操作,您可以尝试如下操作:

var newBData = 
from b in bData
join a in aData on b.LocationId equals a.LocationId into ag
from a in ag.DefaultIfEmpty()
where a == null
select b;

关于c# - Linq2Sql 包含,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18107727/

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