2017-03-02 115 views
1

我正在使用实体框架。我有2个表格:UnitMessage。他们看起来像:基于其他表值在JOIN上过滤数据集

public class Unit 
{ 
    int id; 
    DateTime date; 
} 

public class Message 
{ 
    int id; 
    int unitId; 
    DateTime date; 
} 

我想参加每Unit为每Message

我做这样的事情:

DateTime from = DateTime.Now; 

db.Unit.Join(
    db.Message.Where(m => m.date >= from), 
    u => u.id, 
    s => s.unitId, 
    (u, s) => new 
    { 
     MessageTime = s.date, 
     UnitTime = u.date 
    } 
) 
.AsEnumerable() 
.Select(r => new 
    { 
     MessageTime = MessageTime, 
     UnitTime = UnitTime 
    } 
) 
.ToList() 

Unit类包含date,我想要做的联接时使用。我只想从Message那里得到date> = unit.date的消息。我知道我可以做.Where(x => x.UnitTime >= x.MessageTime),但我不想在此之后进行连接和过滤。

是否可以基于其他表进行过滤?

回答

2

LINQ只支持equijoins。如果你需要不同的连接类型,可以替换JoinSelectMany + Where - EF是足够聪明,将其转换为SQL INNER JOIN

db.Unit.SelectMany(
    u => db.Message.Where(m => u.id == m.unitId && m.date >= u.date && m.date >= from), 
    (u, m) => new 
    { 
     MessageTime = m.date, 
     UnitTime = u.date 
    } 
) 
+0

这就是我真正结束了,非常感谢! – Nikola