2017-03-02 3 views
1

Ich verwende Entity Framework. Ich habe 2 Tabellen: Unit und Message. Sie sehen wie folgt aus:Filterdatensatz auf JOIN basierend auf anderen Tabellenwerten

public class Unit 
{ 
    int id; 
    DateTime date; 
} 

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

ich jeden Unit für jeden Message beitreten möchten.

ich so etwas tun:

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() 

Die Unit Klasse enthält date, die ich verwenden soll, wenn die Verbindung zu tun. Ich möchte nur die Nachrichten von Message nehmen, die date> = unit.date hat. Ich weiß, dass ich .Where(x => x.UnitTime >= x.MessageTime) tun kann, aber ich möchte nicht die Join und Filter danach machen.

Ist es möglich, basierend auf der anderen Tabelle zu filtern?

Antwort

2

LINQ unterstützt nur Equijoins. Für den Fall, müssen Sie verschiedenen Join-Typen, Sie Join mit SelectMany + Where ersetzen können - EF intelligent genug ist, es zu konvertieren INNER JOIN to SQL:

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

Das ist, was ich am Ende tatsächlich mit, danke! – Nikola

Verwandte Themen