2017-03-02 44 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