【问题标题】:LINQ to SQL: Implementing the IN clauseLINQ to SQL:实现 IN 子句
【发布时间】:2014-05-14 17:43:55
【问题描述】:

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

第二条语句有编译错误: 委托“System.Func”不接受 1 个参数 无法将 lambda 表达式转换为类型“字符串”,因为它不是委托类型 '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

【问题讨论】:

    标签: c# linq entity


    【解决方案1】:

    像这样定义你的子查询:

    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
    

    因此只进行一次数据库调用而不是两次。

    【讨论】:

    • 稍后我需要在 where 子句中添加更多内容,因此我不会每次都得到相同的结果。我知道我想要实际的ID,我只是不知道如何修改语句来获取它。
    • 我已经为你做了。您不想使用new {} 子句。
    【解决方案2】:

    您可以在如下语句中做到这一点:

    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 评估为您完成工作。

    【讨论】:

    • 没错,但是对于初学者来说,分句比较简单,而且只要不使用ToArray,速度上并没有明显的区别
    • @NathanA,没错,但更少的代码行意味着更少的管理行:)
    • 我也在查看此语句,并尝试修改以在 Entity Framework 和 ObjectSet 和 ObjectSet 中使用。有什么建议吗?
    猜你喜欢
    • 2011-06-16
    • 2010-10-25
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2018-04-22
    相关资源
    最近更新 更多