我想从一些表中选择一些字段 请帮助将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数据库名称。
在答案直到第一次内部联接完成。请帮我完成最后一节。
答案 0 :(得分:0)
我的原始答案满足了您的问题的上一个版本,其中包括只有两个连接的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子句中的表。