LINQ to SQL:实现IN子句
本文关键字:IN 子句 实现 to SQL LINQ | 更新日期: 2023-09-27 18:03:26
我一直在尝试在linq到sql中实现IN子句。SQL语句为:
SELECT KitId,PartId
FROM Kits k
WHERE k.PartId IN(
SELECT Id
FROM Parts p
WHERE CustomerId > 1 AND CustomerId < 100
我已经读了很多关于这个的条目,到目前为止:
var subquery = (from p in Parts where p.Id > 1 && p.Id < 100 select new {p.ID}).ToArray();
var query = (from k in Kits
where subquery.Contains(k.PartId)
select k).ToList();
第二条语句存在编译错误:委托的系统。Func'不接受1个参数无法将lambda表达式转换为类型"字符串",因为它不是委托类型'AnonymousType#1[]'不包含'Contains'的定义和最佳扩展方法重载'System.Linq. queryable .Contains(System.Linq. queryable .Contains(System.Linq. linq . queryable .Contains) '。IQueryable, TSource)'有一些无效的参数实例参数:无法从'AnonymousType#1[]'转换为'System.Linq.IQueryable'
在第二个语句中替换数组:Int [] subquery = {1,2,3};
导致成功。我如何操作第一个数组来得到一个简单的整数数组?
EDIT:将第一个语句修改为下面的语句将执行第二个语句:
var subquery = from p in ctx.Parts
where p.CustomerId > 1 && p.CustomerId < 10
select p.Id
像这样定义子查询:
var subquery = (from p in Parts where p.Id > 1 && p.Id < 100 select p.ID).ToArray();
您需要实际的ID,而不是具有单一ID值的匿名类型。
也不需要ToArray()部分,如果将其定义为
,则查询应该更快。var subquery = from p in Parts where p.Id > 1 && p.Id < 100 select p.ID
您可以在一个语句中这样做:
var query = Kits.Where(k=> Parts
.Where(p=> p.Id > 1 && p.Id <100)
.Select(r=> r.Id))
.Contains(k.PartId);
您正在获得错误,因为您选择匿名类型与select new {p.ID}
,您可以通过不选择匿名类型而不是选择select p.ID
来消除错误。也不需要ToArray
调用,让LINQ的懒惰评估为您做的工作。