我加入了三个列表:Products、AcceptedOffers和Deliverys。
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"}
};我希望将交付与已接受的报价联系起来,但我无法找到一种方法来查询每个AcceptedOffer/交付的独家用途:
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什么是数学/查询巫毒,使我独家使用每一方?
发布于 2019-09-23 11:52:14
从技术上讲,您可以尝试Linq SelectMany和Zip来实现压缩(即加入Nth报价和Nth交付):
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,
}));https://stackoverflow.com/questions/58061508
复制相似问题