我一直在尝试在 linq to sql 中实现 IN 子句。 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();
第二条语句存在编译错误: 委托(delegate)“System.Func”不接受 1 个参数 无法将 lambda 表达式转换为类型“string”,因为它不是委托(delegate)类型 “AnonymousType#1[]”不包含“Contains”的定义,最佳扩展方法重载“System.Linq.Queryable.Contains(System.Linq.IQueryable, TSource)”有一些无效参数 实例参数:无法从“AnonymousType#1[]”转换为“System.Linq.IQueryable”
将数组代入第二个语句: int[] 子查询 = {1,2,3};
成功的结果。我将如何操作第一个数组以得到一个简单的整数数组?
编辑:将第一条语句更改为以下语句会执行第二条语句:
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
因此只进行一次数据库调用,而不是两次。
关于c# - LINQ 到 SQL : Implementing the IN clause,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23661577/