如何在 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以上是关于如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章
如何从 PostgreSQL 查询转换为 LINQ 或 lambda 表达式
如何将带有内连接的 sql 查询转换为 linq lambda 表达式?
如何使用 Lambda 或 Linq 将匿名类型转换为原始类型成员