2016-12-05 15 views
0

私は次のエンティティを持っています(簡略化のために縮小されています)。エンティティフレームワークコード最も効率的なLinqクエリ

public class Job { 
    Hospital Hospital { get; set; } 
    Status Status { get; set; } 
} 

public class User { 
    string UserId { get; set; } 
    string UserName { get; set; } 
} 

public class UserHospital { 
    User User { get; set;} 
    Hospital Hospital { get; set; } 
} 

public class Hospital { 
    int HospitalId { get; set; } 
} 

ここで、ユーザーがジョブとUserHospitalの関係にある特定のステータスのすべてのジョブのリストを取得したいとします。 POCOSは私がすべてのUserHospital関係を取得し、その後を通じて

var userHospitals = context.Where<UserHospital>(x => x.User.UserName == "username").ToList(); 

して、ループを構築し、ジョブの観点からリストを作成しなければならないと仮定しますレイアウトされている方法で

var jobs = new List<Job>(); 

foreach(var userHospital in userHospitals) 
    jobs.AddRange(context.Where<Job>(x => x.Hospital.Id == userHospital.Hospital.Id).ToList()) 

return jobs; 

これを行う良い方法はありますか?多くの関係に多くの>病院 - あなたはユーザー<のための独立したエンティティを持っていないのはなぜ

var res=context.Where<Job>(j=> context.Any<UserHospital>(u=>u.User.Username=="username" && u.Hospital.Id==j.Hospital.Id)).ToList(); 
+0

したがって、ユーザーは病院、病院のセットへの参照を持っている必要があります - ユーザーのセットへ – tym32167

+0

正しいとし、ジョブが病院への参照を持っています。 –

+0

それは私だけかもしれませんが、このデータベース構造はちょっと奇妙に思えます。ユーザーを仕事につなぎたいのであれば、なぜこれを病院に通わせるのですか?私はあなたのデータベース構造を再考したいかもしれないと思う。 – RandomStranger

答えて

0

はこれを試してみてください? このように両側にコレクションがある場合。

Hospital { 
    Icollection<User> Users{get;set;} 
} 

あなたのクエリは context.Jobs.Where(j=>j.Hospital.Users.Any(u=>u.username=="something"))のような単純なものだろうと、それは良い変換します。

0

関連する問題