我有两个数据持有者列表。
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)
我收到错误消息:
“方法”Int32 Parse(System.String)'没有支持的SQL转换。“
只要在ToList()
之后运行Distinct()
以获取ValidLocationId
,错误消息就会消失,但我希望该方法只能访问数据库一次。< / p>
我在这里错过了有关包含方法的内容吗?
(AData
和BData
是同一个类,LocationId
是int)
答案 0 :(得分:1)
使用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;
答案 1 :(得分:1)
bData.Where(x => aData.Select(y => y.LocationId).Contains(x.LocationId));