我想通过实体框架进行查询,从两个不同的表中联合联系人,按日期删除重复项和订单。我遇到的问题是在不同的日期,使相同的联系人显得独特。我不希望将日期包含在不同的日期,但我确实需要它以便订购。我不能先做排序,删除日期然后执行不同的,因为明显改变了排序。我也不能在工会之前订购,因为这不能确保在工会之后订购。
我想区分除日期之外的所有字段,这只是订购所必需的。
理想情况下,我会将比较器传递给distinct,但EF不能将其转换为SQL。
db.Packages.Select(p => new Recent()
{
Name = p.Attention, Address1 = p.Address1, ... , Date = ShippingDate
})
.Concat(db.Letters.Select(l => new Recent()
{
Name = l.AddressedTo, Address1 = p.Address1, ..., Date = MarkedDate
})
.Distinct()
.OrderByDescending(r => r.Date);
或者SQL中的问题
SELECT DISTINCT Attention, Address1, ShippingDate
FROM Packages
UNION ALL
SELECT AddressedTo, Address1, MarkedDate
FROM Letters
ORDER BY ShipmentDate DESC
答案 0 :(得分:2)
你应该可以使用GroupBy来做你想做的事情,如此(更不用说Group By is more performant than Distinct in EF):
db.Packages.Select(p => new Recent()
{
Name = p.Attention, Address1 = p.Address1, ... , Date = ShippingDate})
.Concat(db.Letters.Select(l => new Recent()
{
Name = l.AddressedTo, Address1 = p.Address1, ..., Date = MarkedDate}))
.GroupBy(p => <parameters to group by - which make the record distinct>)
.Select(g => new {Contact = g.Key, LastShippingDate = g.Max(p => p.ShippingDate)});
答案 1 :(得分:1)
我会关注这种方法,即使有可能然后删除其中一个项目,并留下两个中的随机日期,然后你的排序将是完全不可预测的。