2017-03-02 5 views
1

私はEntity Frameworkを使用しています。私は2つのテーブル:UnitMessageを持っています。彼らはそのようになります。他のテーブル値に基づいてJOINのデータセットをフィルタリングします

public class Unit 
{ 
    int id; 
    DateTime date; 
} 

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

は、私はすべてのMessageごとUnitに参加したいです。

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のみをサポートします。あなたが参加の異なるタイプを必要とする場合は、あなたがSelectMany + WhereJoinを置き換えることができます - 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

関連する問題