2

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

IQueryable<myClass> aData and IQueryable<myClass> bData

两者都包含一个 LocationId 我想删除 bData 中不是来自 aData 中位置的所有实例。因此,如果位置 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 的转换。”

一旦我在to getToList()之后运行 a ,错误消息就会消失,但我希望该方法只能访问数据库一次。Distinct()ValidLocationId

我在这里遗漏了有关 Contains 方法的内容吗?( ADataandBData是同一个类,并且LocationId是一个 int)

4

2 回答 2

1

你能试试下面

 bData.Where(x => aData.Select(y => y.LocationId).Contains(x.LocationId));
于 2013-08-07T16:27:05.710 回答
1

Usingd => 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;
于 2013-08-07T15:48:54.447 回答