LINQ to SQL:实现IN子句

时间:2014-05-14 17:43:55

标签: c# linq entity

我一直在尝试在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

2 个答案:

答案 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评估为你工作。