0

我想通过实体框架进行查询,该框架将两个不同表中的联系人联合起来,按日期删除重复项和订单。我遇到的问题是不同的日期使相同的联系人看起来是唯一的。我不想在不同的日期中包含日期,但之后我确实需要它来进行订购。我不能先进行排序,删除日期然后执行 distinct,因为 distinct 会改变排序。我也不能在工会之前订购,因为这并不能确保在工会之后订购。

我想区分除日期以外的所有字段,这仅在订购时需要。

理想情况下,我会将比较器传递给 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
4

2 回答 2

2

您应该能够使用 GroupBy 来做您想做的事情,就像这样(更不用说Group By 在 EF 中比 Distinct 更高效):

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)});
于 2013-08-07T17:02:13.760 回答
1

我会担心这种方法,即使可能 distinct 会删除其中一个项目并让您在这两个项目中随机选择日期,然后您的排序将完全不可预测。

于 2013-08-07T16:46:58.980 回答