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 之间差异的真实示例? [复制]
由于 .net-core 中的 linq-statement 导致 IEnumerable 和 List 之间出现意外差异? [复制]