2015-07-12 182 views
1

我有一个SQL查询,我正在做一个左连接。它工作正常。转换SQL左连接到Linq表达式左连接

SELECT Table1.Id, Table1.Comments, Table1.IdListDef 
FROM Table2 INNER JOIN Table1 ON Table2.Id = Table1.IdListDef 
LEFT JOIN Table3 
ON Table1.Id = Table3.IdComments 
WHERE Table1.IdListDef = 36 and Table2.IdRev = 1075 and Table3.IdAutor IS NULL 

我需要从这个查询转换为Linq Expression从C#。我该怎么做?我不知道如何转换这个包含左连接的查询。

+5

请不要只是转储SQL并要求转换。至少显示一个类模型,以便导航属性和关联的多样性是可见的。此外,展示你自己的第一个努力。他们向我们澄清的比你想象的更多。特别是导航属性对连接非常重要。你可能不需要任何'join'语句。 –

回答

1

它应该是这个样子:

var result = (
    from item1 in table1 
    join item2 in table2 on item1.IdListDef equals item2.Id 
    join item3 in table3 on item1.Id equals item3.IdComments into finalGroup 
    from finalItem in finalGroup.DefaultIfEmpty() 
    where item1.IdListDef == 36 && item2.IdRev == 1075 && finalItem.IdAutor == null 
    select new 
    { 
     item1.Id, item1.Comments, item1.IdListDef 
    }).ToList(); 

除了你的评论,如果你愿意尝试任何项目都有你的外在参数的ID你可以使用linq 任何扩展方法:

bool idExists = result.Any(item => item.id == idAutor); 
+0

真的很好!有效!谢谢! 你知道如何在这个选择中计数吗? 现在我想要计算idAutor是否存在,如果不存在,则会计数= 0。IdAutor现在来自参数。 – Victor

+0

@Victor你想看看结果中的item1.Id是否等于你的外部IdAutor参数? – msmolcic

-1

尝试此查询

VAR OBJLIST=(FROM A IN CONTEX.TABLE2 
     FROM B IN CONTEX.TABLE1.WHERE(X=>X.IdListDef==a.Id && B.IdListDef==36 && B.IdRev==1075) 
     FROM C IN CONTEX.TABLE3.WHRE(X=>X.IdComments==a.Id).DefaultEmpty() 
     where C.IdAutor==NULL 
     select new{a.Id, a.Comments, a.IdListDef }).ToList() 
+0

这不会编译,C#区分大小写。 – svick