【问题标题】:How to do a SQL Query Proper way on LINQ and Lambda Expression LINQ C#如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询
【发布时间】: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重复

标签: c# .net linq lambda


【解决方案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,它仍然会以相同的方式完成,所以它是别的东西,但如果看不到则无济于事
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多