Исключительное использование сущности из Продукта Запроса - PullRequest
3 голосов
/ 23 сентября 2019

У меня есть 3 списка, к которым я присоединяюсь: Product s, AcceptedOffer s и Delivery s

List<Product> products = new List<Product>() {
    new Product(){ Id = 1, Name = "Drink" }
};

List<AcceptedOffer> accepted = new List<AcceptedOffer>() {
    new AcceptedOffer(){ Id = 10, ProductId = 1  },
    new AcceptedOffer(){ Id = 11, ProductId = 1  }
};

List<Delivery> deliveries = new List<Delivery>() {
    new Delivery(){ Id = 101, ProductId = 1, Status = "Success" },
    new Delivery(){ Id = 102, ProductId = 1, Status = "Failure"}
};

Я хочу связать поставки с принятыми предложениями, но я могу 't найти способ запроса, который имеет исключительное использование каждого AcceptedOffer / Delivery:

var test = from d in deliveries
           join p in products on d.ProductId equals p.Id
           join ao in accepted on p.Id equals ao.ProductId
           select new { d, p, ao };

Это дает:

Drink | 10 | Success
Drink | 11 | Success
Drink | 10 | Failure
Drink | 11 | Failure

Если я группирую по Принятому предложению, то FirstOrDefault() обе доставкиудалось;Группировка по доставке и первый AcceptedOffer - это то же самое.

Мне нужно:

Drink | 10 | Success
Drink | 11 | Failure

Что за математика / запрос вуду, которая дает мне исключительное использование каждой стороны?

1 Ответ

3 голосов
/ 23 сентября 2019

Технически, вы можете попробовать Linq SelectMany и Zip, чтобы реализовать zipping (то есть объединение N-го предложения с N-й доставкой):

Accepted Offer            ->  Delivery
----------------------------------------------------------------------------
{ Id = 10, ProductId = 1} -> { Id = 101, ProductId = 1, Status = "Success" } 
{ Id = 11, ProductId = 1} -> { Id = 102, ProductId = 1, Status = "Failure" }
 ...
 N-th offer               -> N-th delivery

Код:

   var result = products // for each product                              
     .SelectMany(prod => deliveries             
         // we get corresponding deliveries
        .Where(del => del.ProductId = prod.Id)  
         // which we mechanically zip with filtered accepted offeres
        .Zip(accepted.Where(acc => acc.ProductId = prod.Id), 
           (del, acc) => new {
             d  = del.Status,
             p  = prod.Id,   
             ao = acc.Id,
         }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...