实体框架不同但不在所有列上

时间:2013-08-07 16:39:23

标签: c# entity-framework

我想通过实体框架进行查询,从两个不同的表中联合联系人,按日期删除重复项和订单。我遇到的问题是在不同的日期,使相同的联系人显得独特。我不希望将日期包含在不同的日期,但我确实需要它以便订购。我不能先做排序,删除日期然后执行不同的,因为明显改变了排序。我也不能在工会之前订购,因为这不能确保在工会之后订购。

我想区分除日期之外的所有字段,这只是订购所必需的。

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

2 个答案:

答案 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)

我会关注这种方法,即使有可能然后删除其中一个项目,并留下两个中的随机日期,然后你的排序将是完全不可预测的。