【问题标题】:C# LINQ translation for a SQL query with RIGHT JOIN带有 RIGHT JOIN 的 SQL 查询的 C# LINQ 翻译
【发布时间】:2016-04-07 16:18:16
【问题描述】:

我在 ACCESS 中有一个查询,我必须在 C# LINQ 中翻译这个查询。

SELECT DETAIL.*, 
       "" AS DBC_ART, 
       A_ENS.ENS_CODE, 
       A_LEA.LEA_ART, 
       A_ART_1.ART_CHA, 
       A_ART_1.ART_ANA, 
       A_ANA_REPART.ANA_CLA2 
FROM (
       (A_LEA RIGHT JOIN 
        ((DETAIL LEFT JOIN A_ART ON DETAIL.DFA_ART = A_ART.ART_CODE)
         LEFT JOIN A_ENS ON DETAIL.DFA_ART = A_ENS.ENS_CODE) ON A_LEA.LEA_ENS = A_ENS.ENS_CODE) 
         LEFT JOIN A_ART AS A_ART_1 ON A_LEA.LEA_ART = A_ART_1.ART_CODE) 
         LEFT JOIN A_ANA_REPART ON A_ART_1.ART_ANA = A_ANA_REPART.ANA_CODE 
WHERE (((A_ENS.ENS_CODE) Is Not Null) AND ((A_ART.ART_CODE) Is Null)) 
ORDER BY DETAIL.BCI, DETAIL.FACTURE;

我并不完全需要 detail 字段,因为它是查询中的详细信息。*(我会自己找到必要的)

这是我不知道如何翻译它们的多个 JOIN。 我有每 5 个表的对象列表

I.E.

详细信息 -> LstDetail

A_ART -> LstA_ART

A_ENS -> LstA_ENS

A_LEA -> LstA_LEA

A_ART_1 -> LstA_ART(A_ART1 是与 A_ART 不同的另一个连接的别名)

A_ANAREPART -> LstA_ANAREPART

所以我开始写类似的东西:

MyList = (from itemDetail in LstDetail 
          join itemART in LstART 
            on itemDetail.DFA_ART equals itemART.ART_CODE 
          join itemANA_REPART in LstANA_REPART 
            on itemART.ART_ANA equals itemANA_REPART.ANA_CODE 
          select (...)).ToList();

但我不知道如何处理查询中的正确联接。我应该进行多个 linq 查询吗?什么样的?

提前感谢您的回答

【问题讨论】:

  • 你看过其他例子吗? stackoverflow.com/questions/9914623/…
  • 右连接只是相反方向的左连接,你不能只是重新排序查询,所以它都是左连接。此外,如果您要进行左连接,则需要使用 DefaultIfEmpty() 语法,否则 linq 会将其视为内连接
  • @Bob Vale 您将右连接转换为左连接的方法是正确的,但我需要分别进行每个连接,因为我总是遇到此错误:“对象引用未设置为对象的实例”(我认为这是由于加入了 NULL 值的字段)。谢谢。

标签: c# sql linq


【解决方案1】:

这样的东西可能会翻译,您可能需要调整大小写,因为我使用了所有小写字母。此外,您需要选择如何处理detail.*,或者将d... 替换为来自详细信息d.field1, d.field2 或类似detail = d 的字段列表,以允许将详细记录作为对象包含在内。

var query = from d in detail
join a1 in a_art on d.dfa_art equals a1.art_code into art
from a in art.DefaultIfEmpty()
join ae1 in a_ens on d.dfa_art equals ae1.ens_code into ens
from ae in ens.DefaultIfEmpty()
join al1 in a_lea on ae.ens_code equals al1.lea_ens into lea
from al in lea.DefaultIfEmpty()
join a2 in a_art on al.art_code equals a2.lea_art into art1
from a1 in art1.DefaultIfEmpty()
join ar1 in a_ana_repart on a1.art_ana equals ar1.ana_code into ana
from ar in ana.DefaultIfEmpty()
where (ae.ens_code != null && a.art_code == null)
select new {
    d...,
    ae.ens_code,
    al.lea_art,
    a1.art_cha,
    a1.art_ana,
    ar.ana_cla2
};

【讨论】:

  • 我已经简单地将右连接翻译成对应的左连接
  • 正确答案:只需要在对象结果中添加前缀:ae != null ? ae.ens_code:字符串。空;等等其他领域...
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 2018-11-24
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多