【问题标题】:Creating LINQ with where clause使用 where 子句创建 LINQ
【发布时间】:2023-03-20 15:47:01
【问题描述】:

我有这个 LINQ:

    private static object getObjectModels(DbContext context, IQueryable<int> contractsID)
    {
        return (from objectModel in context.Set<ObjectModel>()
                where "column named conId contains contractsID "
                select new ContractHelper
                {
                    Id = contract.Id,
                    ClientId = contract.ClientId,
                });
    }

我需要从名为 conID 的列具有contractsID 值的表记录中进行选择。

contractsID 是 int 数组。 conID 是 int 值列。

我在这一行写了什么: 其中“名为 conId 的列包含contractsID” 获取列 conID 的项目与contractsID 数组中的项目相等的所有记录?

【问题讨论】:

标签: c# .net linq


【解决方案1】:

您也许可以反转 where 子句并使用“包含”,例如:

private static object getObjectModels(DbContext context, IQueryable<int> contractsID)
    {
        return (from objectModel in context.Set<ObjectModel>()
                where objectModel.conId.HasValue && contractsID.Contains(objectModel.conId)
                select new ContractHelper
                {
                    Id = contract.Id,
                    ClientId = contract.ClientId,
                });
    }

但是,您可能需要将 IQueryable 转换为列表。

var myIds = contractIDs.ToList();
...
where myIds.Contains(objectModel.conId)
...

【讨论】:

  • objectModel.conId 列可以为空,所以在尝试使用您的示例时出现错误。有什么方法可以解决吗?
  • 我会用一个建议更新我的答案,不过我没有 EF 项目可以测试它!
【解决方案2】:

您可以使用 int 数组来使 linq 转换为正确的 IN SQL 语法

  private static object getObjectModels(DbContext context, IQueryable<int> contractsID)
    {
         // Necessary to translate Contains to SQL IN  CLAUSE
        int [] contractIdsArray = contractsID.ToArray() ; 

        return (from objectModel in context.Set<ObjectModel>()
                where contractIdsArray.Contains(objectModel.conId)
                select new ContractHelper
                {
                    Id = contract.Id,
                    ClientId = contract.ClientId,
                });
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-24
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多