Ienumerable 和 DB 表之间的 LINQ 内部连接

Posted

技术标签:

【中文标题】Ienumerable 和 DB 表之间的 LINQ 内部连接【英文标题】:LINQ inner join betwenn Enumerable and DB Table 【发布时间】:2010-09-15 21:02:40 【问题描述】:

我正在尝试确定当用户提交表单时要从数据库中删除哪些记录。 该页面有两个CheckBoxList,一个代表修改前的记录,一个代表修改后的记录。

我可以像这样轻松获取需要删除的选定值...

//get the items not selected that were selected before
var oldSelectedItems = from oItem in oldChklSpecialNeeds.Items.Cast<ListItem>()
                       where !(from nItem in newChklSpecialNeeds.Items.Cast<ListItem>()
                               where nItem.Selected
                               select nItem.Value).Contains(oItem.Value)
                           && oItem.Selected
                       select oItem.Value;

现在我正在尝试做这样的事情,但它不允许...

var itemsToDelete = from specialNeed in db.SpecialNeeds
                           join oldSelectedItem in oldSelectedItems on specialNeed.SpecialNeedsTypeCd equals oldSelectedItem.Value
                           where specialNeed.CustomerId == customerId

我可以轻松地为每个项目使用一个 foreach 循环和一个 .DeleteOnSubmit() 但我认为有一种方法可以使用 LINQ 的功能并将内部连接的整个查询结果传递给 .DeleteAllOnSubmit()

//like so
db.SpecialNeeds.DeleteAllOnSubmit(itemsToDelete); 

有什么想法吗?

【问题讨论】:

【参考方案1】:

您遇到的错误是什么? SpecialNeedsTypeCd 和 oldSelectedItem.Value 之间的类型不匹配吗?您是否只是在这篇文章的第二个 Linq 语句中省略了 select 或者这是问题所在?

【讨论】:

【参考方案2】:

本地集合可以通过 Contains() 方法在 LINQ to SQL 中使用。您可以尝试使用 Contains() 将 join 子句更改为 where

var itemsToDelete = from specialNeed in db.SpecialNeeds
                    where oldSelectedItems.Contains(specialNeed.SpecialNeedsTypeCd)
                       && specialNeed.CustomerId == customerId
                    select ...;

【讨论】:

.Contains 正是我所需要的!

以上是关于Ienumerable 和 DB 表之间的 LINQ 内部连接的主要内容,如果未能解决你的问题,请参考以下文章

IQueryable 和 IEnumerable 之间差异的真实示例? [复制]

在List之间自由转换 和IEnumerable

mysql--权限问题

由于 .net-core 中的 linq-statement 导致 IEnumerable 和 List 之间出现意外差异? [复制]

具有不同表结构的两个 DB2 表中的数据值之间的差异

具有不同表结构的两个DB2表中的数据值之间的差异