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

LINQ to SQL:实现IN子句

像这样定义子查询:

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的懒惰评估为您做的工作。