我一直在尝试在linq中实现IN子句到sql。 SQL语句是:
SELECT KitId,PartId
FROM Kits k
WHERE k.PartId IN(
SELECT Id
FROM Parts p
WHERE CustomerId > 1 AND CustomerId < 100
我已经阅读了很多SO条目,到目前为止:
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();
第二个语句中存在编译器错误: 委托'System.Func'不带1个参数 无法将lambda表达式转换为类型'string',因为它不是委托类型 'AnonymousType#1 []'不包含'Contains'的定义,最好的扩展方法重载'System.Linq.Queryable.Contains(System.Linq.IQueryable,TSource)'有一些无效的参数 实例参数:无法从'AnonymousType#1 []'转换为'System.Linq.IQueryable'
将数组替换为第二个语句: int [] subquery = {1,2,3};
取得成功。我如何操纵第一个数组以得到一个简单的整数数组?
编辑:将第一个语句改为以下语句执行第二个语句:
var subquery = from p in ctx.Parts
where p.CustomerId > 1 && p.CustomerId < 10
select p.Id
答案 0 :(得分:3)
像这样定义子查询:
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
这样只能进行一次DB调用而不是两次。
答案 1 :(得分:3)
您可以在以下语句中执行此操作:
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评估为你工作。