将SQL Left JOIN转换为Linq

时间:2011-01-03 03:33:00

标签: linq-to-sql join

我一直在争论这个问题,但我找不到一个可靠的例子,所以我有希望转向专家。提前感谢任何帮助。

我有一个工作的SQL查询,我需要转换为Linq。最初,我有一个简单的linq查询驱动一个MSChart(折线图),显示列表中项目的每日排名。不幸的是,MSChart不会从图表中删除带有空值的天数,而只是将它们连接到第二天并使用非空值,因此我必须将空值替换为0。

以下查询通过对表的Left,Self Join执行此操作,我只抓取不同的天数列表(包括所有日期)。我知道我可以设置一个包含所有日期列表的辅助表,但这在所有情况下都应该同样有效。随后的SQL在SSMS中完美地适用于特定书籍/列表组合:

select L2.date, ISNULL(L1.ranking,0)  
from (select distinct date from ListItem where ListID = 1) L2  
Left join ListItem L1 on L2.date = L1.date and L1.BookID = 1 and L1.ListID = 1  
order by date

这将返回所有日期和排名的列表,对于没有排名的任何日期排名为0。现在为了将图表绑定到此,我相信转换到Linq是最好的方法。

到目前为止,我会发布我的尝试,但我担心他们是错误的。如果需要更多信息,请告诉我。

感谢。

-Dan

1 个答案:

答案 0 :(得分:1)

这样的东西?

var distinctDates = 
    ListItems
        .Where(li => li.ListId == 1)
        .Select(li => li.date)
        .Distinct();

var list1 = 
    ListItems
        .Where(li => li.BookID == 1 && li.ListID == 1);

var results = 
    distinctDates
        .Join(
            list1,
            d => d,
            li1 => li1.date,
            (d, li1) => new{ date = d, ranking = li1.ranking ?? 0 }
        )
        .OrderBy(x => x.date);

(自第1次转变以来做了一些改变)