Linq2Sql包含

时间:2013-08-07 15:40:38

标签: c# linq linq-to-sql

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

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>

我在这里错过了有关包含方法的内容吗? (ADataBData是同一个类,LocationId是int)

2 个答案:

答案 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));