Linq合并查询

时间:2010-09-29 08:23:55

标签: c# linq

我想要合并两个查询。这可能是左外连接,但看起来不同。

第一个查询从表中选择不同的东西:

var d = from d in db.Data
        select (d.ID, d.Label, Value = 0).Distinct;

让我们假设这会返回以下内容:

{1,"Apple",0}
{2,"Banana",0}
{3,"Cabbage",0}

然后我有另一个查询做出不同的选择:

var s = from d in db.Data
        where d.Label != "Apple"
        select (d.ID, d.Label, d.Value);

返回:

{2,"Banana",34}
{3,"Cabbage",17}

然后,我想要第三个查询,根据ID和标签将d和s连接在一起。我希望结果看起来像这样:

{1,"Apple",0}
{2,"Banana",34}
{3,"Cabbage",17}

我基本上只是更新第三个查询中的数字,但我不知道我应该怎么做。感觉它应该是一个简单的连接,但我无法让它工作。

3 个答案:

答案 0 :(得分:3)

这应该有效:

var query1 = from d in db.Data
             select new { d.ID, d.Label, Value = 0 }.Distinct();
var query2 = from d in db.Data
             where d.Label != "Apple"
             select new { d.ID, d.Label, d.Value };

var result =
        from d1 in query1
        join d2 in query2 on new { d1.ID, d1.Label } equals new { d2.ID, d2.Label } into j
        from d2 in j.DefaultIfEmpty()
        select new
        {
            d1.ID,
            d1.Label, 
            Value = d2 != null ? d2.Value : d1.Value
        };

注意:您确定要加入ID 标签吗?这对我来说似乎很奇怪......标签不应该是密钥的一部分,因此对于给定的ID它应该始终是相同的

答案 1 :(得分:2)

这是一个使用方法链,这是我个人的最爱。

        var one = db.Data.Select(f => new {f.Id, f.Label, Value = 0});
        var two = db.Data.Select(f => f).Where(f => f.Label != "Apple");

        var three = one.Join(two, c => c.Id, p => p.Id, (c, p) => new {c.Id, c.Label, p.Value});

答案 2 :(得分:0)

你能做到吗

var s = from d in db.Data
        select new
        {
           Id = d.ID,
           Label = d.Label,
           Value = (d.Label == "Apple" ? 0 : d.Value)
        };