如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询

Posted

技术标签:

【中文标题】如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询【英文标题】:How to do a SQL Query Proper way on LINQ and Lambda Expression LINQ C# 【发布时间】:2021-09-22 12:44:16 【问题描述】:

你好,我如何像这样对 SQL 查询进行 LINQ:

SELECT 
 c.Value as IPAddress,
 cd.Number as PrintNo,
 cd.TerminalNumber as TerminalNo
FROM 
 configuration c,
 ConfigurationDevice cd                    
WHERE 
 c.DeviceID=cd.ConfigurationDeviceID                  
AND Parameter = 'IPAddress'
AND DeviceID IN (   
    SELECT 
      ConfigurationDeviceID 
    FROM 
      ConfigurationDevice 
    WHERE 
     [Type]=1 
    AND TerminalNumber > 0              
)

任何人都可以显示从简单到这种 SQL 查询的 Lambda 表达式的 LINQ,其中另一个 SQL 语句声明是在 SQL 查询语句中完成的。

这也是我到目前为止所做的,但我在调用结果列时也出错了。

【问题讨论】:

如果您将 LINQ 与 SQL 数据库一起使用,而不是使用从 c# 代码到数据库的实体连接。看起来您正在尝试将 LINQ 与无法工作的 SQLConnection 一起使用。您可以使用 SQLAdapter 并将查询结果放入 DataTable 中,然后在 DataTable 上使用 Linq。 所以您希望我们将您的 sql 语句翻译成 linq 查询?=! IN 运算符的 linq 等效项是 Contains 方法。 AND&&。 select 子句排在最后。这应该会有所帮助 它是另一个查询中的查询,我不熟悉 LinQ,这是我的问题的关键部分,我也想了解如何。 嵌套查询没有魔法。使用 where 过滤第二个集合,在最后进行选择并检查 contains。:firstCollection.Where( x => secondColelction.Where(...).Select(s => s.ConfigurationDeviceID).Contains(x.DeviceId)).Select(x => x).ToList() 可能与Convert SQL to LINQ Query重复 【参考方案1】:

首先,如果您要编写 SQL,请将其编写为 ANSI SQL 而不是 Oracle SQL。 ANSI SQL 得到更广泛的支持。

ANSI SQL 版本

SELECT 
 IPAddress as Value,
 cd.Number,
 cd.TerminalNumber
FROM 
-- also flipped the root as it seem to make more sense to me
 ConfigurationDevice  cd 
join configuration c on  cd.ConfigurationDeviceID=c.DeviceID
WHERE 
 Parameter = 'IPAddress'
AND DeviceID IN (   
    SELECT 
      ConfigurationDeviceID 
    FROM 
      ConfigurationDevice 
    WHERE 
     [Type]=1 
    AND TerminalNumber > 0              
)

你没有展示任何关于你所拥有的实体方面的东西。

实体

配置 配置设备
var subQuery = (
  from cd in ctx.ConfigurationDevice 
  where 
     cd.Type ==1
  && cd.TerminalNumber > 0 
  select 
    cd.ConfigurationDeviceID 
);//.ToList();

var query = (
  from cd in ctx.ConfigurationDevice
  join c in ctx.Configuration on cd.ConfigurationDeviceID equals c.DeviceID
  where 
     c.Parameter == "IPAddress"
   && subQuery.Contains(c.DeviceID) 
  select new //Add a type here
  
     Value = c.IPAddress,
     Number = cd.Number,
     TerminalNumber = cd.TerminalNumber
  );

var result = query.ToList();

【讨论】:

“更广泛的支持”太棒了!仅为此您应该获得赞成票;) 在子查询部分它有一个错误说 :: CS1929: IQueryable 不包含包含的定义和最佳扩展方法重载 'MemoryExtensions.Contains(ReadOnlySpanGuid?) 需要 ReadOnlySpan 类型的接收器 这可能是由于我的 ID 使用了它的 GUID @MikAA 请添加您的课程,以便我们查看类型和您正在尝试做的事情 @MikAA 无论是字符串、int 还是 guid,它仍然会以相同的方式完成,所以它是别的东西,但如果看不到则无济于事

以上是关于如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

如何使用lambda表达式和LINQ将数据插入数据库表?

如何从 PostgreSQL 查询转换为 LINQ 或 lambda 表达式

如何将带有内连接的 sql 查询转换为 linq lambda 表达式?

如何使用 Lambda 或 Linq 将匿名类型转换为原始类型成员

将多级 for 循环转换为 linq 或 lambda 表达式

如何解决 C# 中 linq 的 lambda 表达式中的对象引用错误?