首页 > 解决方案 > 如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询

问题描述

你好我如何做一个 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 查询语句中完成的。

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

在此处输入图像描述

标签: c#.netlinqlambda

解决方案


首先,如果您要编写 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();

推荐阅读