Linq Merge Queries

У меня есть два запроса, которые я хотел бы объединить. Это может быть левое внешнее соединение, но оно кажется другим.

Первый запрос выбирает разные вещи из таблицы:

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}

Затем я хочу третий запрос, который объединяет d и s на основе их идентификатора и метки. Я хочу, чтобы результат выглядел так:

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

Я просто обновляю числа в третьем запросе, но понятия не имею, как мне это сделать. Такое ощущение, что это должно быть простое соединение, но я просто не могу заставить его работать.

Ответы на вопрос(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а также этикетка ? Мне это кажется довольно странным ... метка не должна быть частью ключа, поэтому она всегда должна быть одинаковой для данного идентификатора

 SeegeDev10 сент. 2016 г., 07:50
Это сработало для меня! Спасибо Томас! :)

который мой личный фаворит.

        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});
 RPM198429 сент. 2010 г., 10:55
Оу, лямбда-переполнение. отлично.

Не могли бы вы просто сделать

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

Ваш ответ на вопрос