如何将带有内连接的 sql 查询转换为 linq lambda 表达式?
Posted
技术标签:
【中文标题】如何将带有内连接的 sql 查询转换为 linq lambda 表达式?【英文标题】:how to convert sql query with inner join to linq lambda expression? 【发布时间】:2012-04-20 15:38:41 【问题描述】:我想从一些表中选择一些字段 请帮助将 sql 查询转换为 linq,我需要将这些值显示到 mvc3 webgrid 中。
如何将内部联接转换为 linq?或者有什么办法在EF中做到这一点?
SELECT
DISTINCT
SecurityIdentifier_All.SecurityId,
NAV.CompanyName,
NAV.SecurityType,
SecurityIdentifier_All.Identifier,
SecurityIdentifier_All.SecurityIdentifierTypeId
FROM
Fireball_Reporting..Reporting_DailyNAV_Pricing NAV
INNER JOIN
Fireball_Reporting..SecurityIdentifier_All ON
SecurityIdentifier_All.SecurityId = NAV.PricingSecurityID
inner join
(
SELECT SecurityId, MAX(SecurityIdentifierTypeId) SecurityIdentifierTypeId
FROM Fireball_Reporting..SecurityIdentifier_All
where SecurityIdentifierTypeId in (1,16)
group by SecurityId
) IdentifierType on
IdentifierType.SecurityId = SecurityIdentifier_All.SecurityId and
IdentifierType .SecurityIdentifierTypeId =
SecurityIdentifier_All.SecurityIdentifierTypeId
WHERE
Date = Fireball_Configuration.dbo.PreviousBusinessDay()
在上面的SecurityIdentifier_All
和NAV
是一个视图。
Fireball_Reporting 数据库名称。
在答案中直到第一个内部连接完成。请帮我完成最后一部分。
【问题讨论】:
您的查询太复杂了。你不指望有人做所有这些工作吗?请简化。 【参考方案1】:我的原始答案满足了您问题的先前版本,其中包括一个只有两个连接的 SQL 查询。
既然您有三个 INNER JOINS,我不会尝试在一个 LINQ 查询中完成所有这些操作。你当然可以,但它的可读性不是很好(很像你的 SQL 版本)。
我会在单独的步骤中执行子查询。像这样的:
var identifierType = context.SecurityIdentifier_Alls
.Where(si => si.SecurityIdentifierTypeId == 1 || si.SecurityIdentifierTypeId == 6)
.GroupBy(si => si.SecurityId)
.Select(g => new SecurityId = g.Key, SecurityIdentifierTypeField = g.Max(si => si.SecurityIdentifierTypeId) );
var query =
(from nav in context.Reporting_DailyNAV_Pricings
from si in context.SecurityIdentifier_Alls
from idt in identifierTypes
where si.SecurityId = nav.PricingSecurityID
&& idt.SecurityId == si.SecurityId
select new si.SecurityId, nav.CompanyName, nav.SecurityType, si.Identifier, si.SecurityIdentifierTypeId )
.Distinct();
我没有在 UDF 工作以获得前一个工作日。此外,这些都没有经过测试(当然),但这可能与您正在寻找的内容接近。
我不确定你有什么可用的。如果您使用设置了导航属性的 LINQ-to-Entities,则无需在上述代码的 where 子句中链接表。
【讨论】:
需要做内连接请帮助 INNER JOIN Fireball_Reporting..SecurityIdentifier_All ON SecurityIdentifier_All.SecurityId = NAV.PricingSecurityID 内连接 ( SELECT SecurityId, MAX(SecurityIdentifierTypeId) SecurityIdentifierTypeId FROM Fireball_Reporting..SecurityIdentifier_All where SecurityIdentifierTypeId in (1 ,16) 按 SecurityId 分组 IdentifierType.SecurityId 上的 IdentifierType = SecurityIdentifier_All.SecurityId 和 IdentifierType .SecurityIdentifierTypeId = SecurityIdentifier_All.SecurityIdentifierTypeId WHERE Date = Fireball_Configuration.dbo.PreviousBusinessDay() 我添加了更多代码——您更新的问题比我最初回答的问题要复杂得多。这是我所能接受的。祝你好运! 非常感谢 Duane 的尝试以上是关于如何将带有内连接的 sql 查询转换为 linq lambda 表达式?的主要内容,如果未能解决你的问题,请参考以下文章
如何将带有内连接语句的 Sql 查询转换为带有 Where 语句的 sql 查询(语句中没有内连接)