嵌套左联接的C#Linq表达式 - c#

我想在linq表达式中格式化嵌套的左联接。我已经下载了LINQPad4,但是它似乎没有能力将SQL转换为linq。

我不明白如何获得嵌套的左联接。我试图用'into'子句操纵表达式无济于事。

Linq表情

from cli in Clients
join er in EntityRelationships on cli.EGUID equals er.ParentID
join con in Contacts on er.ChildID equals con.EGUID

join erEmail in EntityRelationships on er.EGUID equals erEmail.ParentID into erIfAny
from r in erIfAny.DefaultIfEmpty()
join ea in EmailAddresses on r.ChildID equals ea.EGUID
join eaDefault in EntityDefaultValues on r.ID equals eaDefault.RelationshipID

where cli.ClientID == 6
select new
{
    ContactID = con.ContactID,
    ContactLastName = con.ContactLastName,
    ContactFirstName = con.ContactFirstName,
    ContactTitle = con.ContactTitle,
    EmailAddress = ea
}).Distinct()

产生以下SQL语句

DECLARE @p0 Int = 6

SELECT DISTINCT con.*, ea.*
FROM Clients AS cli
INNER JOIN EntityRelationships AS er ON cli.eGUID = er.ParentID
INNER JOIN Contacts AS con ON er.ChildID = con.eGUID

LEFT OUTER JOIN EntityRelationships AS erEmail ON er.eGUID = erEmail.ParentID
INNER JOIN EmailAddresses AS ea ON erEmail.ChildID = ea.eGUID
INNER JOIN EntityDefaultValues AS eaDefault ON erEmail.ID = eaDefault.RelationshipID

WHERE cli.ClientID = @p0

但是,我需要将左后的两个内部连接像这样包裹在左内。

DECLARE @p0 Int = 6

SELECT DISTINCT con.*, ea.*
FROM Clients AS cli
INNER JOIN EntityRelationships AS er ON cli.eGUID = er.ParentID
INNER JOIN Contacts AS con ON er.ChildID = con.eGUID

LEFT OUTER JOIN EntityRelationships AS erEmail
    INNER JOIN EmailAddresses AS ea ON erEmail.ChildID = ea.eGUID
    INNER JOIN EntityDefaultValues AS eaDefault ON erEmail.ID = eaDefault.RelationshipID
ON er.eGUID = erEmail.ParentID

WHERE cli.ClientID = @p0

我的linq表情应该是什么样?

编辑:

不知道我能做到这一点,但最终我只是写了内联SQL。

var query = db.Database.SqlQuery<ContactViewModel>(
"select distinct con.*, ea.Value as EmailAddress " +
"from Clients AS cli " +
"join EntityRelationships AS er ON cli.eGUID = er.ParentID " +
"join Contacts AS con ON er.ChildID = con.eGUID " +
"left join EntityRelationships AS erEmail " +
    "join EmailAddresses AS ea ON erEmail.ChildID = ea.eGUID " +
    "join EntityDefaultValues AS eaDefault ON erEmail.ID = eaDefault.RelationshipID " +
"on er.eGUID = erEmail.ParentID " +
"where cli.ClientID=" + cID.ToString() + " " +
"order by con.ContactLastName, con.ContactFirstName");

参考方案

对于人们来说,尝试获取LINQ代码以匹配他们过去使用的SQL是一个非常常见的错误。由于SQL仅限于扁平化的结果集,而面向对象的代码可以表示更丰富的层次数据,因此,如果您不再对SQL方面的问题进行过多思考,则很可能可以在LINQ查询中更好地建模您真正想要的东西。

我不完全确定您要在这里做什么,但通常LINQ中的左外连接最终看起来像一个对象,而其属性之一具有其他对象:

from cli in Clients
where cli.ClientID == 6
join er in EntityRelationships on cli.EGUID equals er.ParentID
join con in Contacts on er.ChildID equals con.EGUID
select new
{
    ContactID = con.ContactID,
    ContactLastName = con.ContactLastName,
    ContactFirstName = con.ContactFirstName,
    ContactTitle = con.ContactTitle,
    Emails = 
        from erEmail in EntityRelationships
        where er.EGUID == erEmail.ParentID
        join ea in EmailAddresses on r.ChildID equals ea.EGUID
        where EntityDefaultValues.Any(eaDefault => r.ID == eaDefault.RelationshipID
        select ea
}

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

改造正在返回一个空的响应主体 - java

我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…

每个文件合并后添加换行 - python

我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…

Json到php,json_decode返回NULL - php

我正在用PHP进行JSON解析器的一些API,用于存储有关遗产的信息。我在解析时遇到问题,因为它返回的是NULL值而不是数组或对象。简单的JSON代码可以很好地解析,但是可以这样:{"success":true,"totalCount":1,"data":[{"id":99694…

通过ExecutorService执行线程时Thread.join()不起作用 - java

这是我的代码:public static void main(String[] args) { System.out.println("program started"); ExecutorService executor = Executors.newCachedThreadPool(); Thread thread = new Thr…