2016-11-25 14 views
0

エンティティフレームワークの新機能です(6.0を使用していますが、更新が必要な場合)。エンティティをlinqクエリにバインドする方法を探しています。例えば、私が持っている:彼らの両方がデータベース内のテーブルにマップされEntity Frameworkのマップエンティティからlinqクエリへ

public class User 
{ 
    public string Name {get;set;} 
    public WorkPlace Place {get;set;} 
    public bool IsAlive{get;set;} 
} 

public class WorkPlace 
{ 
    public string Name {get;set;} 
    public bool IsActive {get;set;} 
    public Collection<User> Users; 
} 

をし、私が持っているOnModelCreating

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().ToTable(tableName: "users"); 
    modelBuilder.Entity<WorkPlace>().ToTable(tableName: "workplaces"); 
} 

しかし、私は(ナビゲーションと遅延ロードで)別のオブジェクトを使用する必要があります。

public class CustomUser 
{ 
    public string Name {get;set;} 
    public CustomWorkPlace Place {get;set;} 
} 

public class CustomWorkPlace 
{ 
    public string Name {get;set;} 
    public Collection<CustomUser> Users; 
} 

someBuilder.Entity<CustomUser>().ToLinq(cntx => cntx.Set<User>().Where(user => user.IsAlive)).MapProperties(); 
// the way of mapping properties is not important 
someBuilder.Entity<CustomWorkPlace>().ToLinq(cntx => cntx.Set<WorkPlace>().Where(place => plase.IsActive)).MapProperties() 

そして、それの最も興味深いのは、ナビゲーションを通過している私は、ユーザーの会社を得るとき、私は、COMのためにアクティブでない会社、及びこれを取得してはなりませんpany - 私は生きていないユーザーにマップされているCustomUserを取得してはいけません。

どうもありがとう

+1

何が問題なのですか? – Kinetic

+0

エンティティ・フレームワークまたはナゲット・エクステンションでこのロジックを実装する(カスタム・オブジェクトをコンテキストから取得する方法)。 – VVildVVolf

+1

通常のエンティティを使用してデータをロードし、そこからカスタムデータを作成します。 – Kinetic

答えて

0

あなたのような、適切なゲッターでこれを行うことができます:

public class User 
{ 
    public string Name {get;set;} 
    public WorkPlace Place get{ return this.WorkPlace.Where(x => x.IsActive).FirstOrDefault();} 
    public bool IsAlive{get;set;} 
} 
+0

LevelUpの開発者(私はこのフィールドについて知っておくべきではない)から不慣れなプロパティ(IsAliveなど)を隠さなければならず、FirstOrDefaultメソッドは私の知る限りこのクエリーを実現しますが、挿入と更新をサポートする必要はありません)。 – VVildVVolf

0

あなたは、このようなあなたのナビゲーションプロパティにマップする必要があります。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>().ToTable(tableName: "users"); 
    modelBuilder.Entity<WorkPlace>().ToTable(tableName: "workplaces"); 
    modelBuilder.Entity<User>() 
     .HasRequired(user => user.Place) 
     .WithMany(place => place.Users); 
} 

をその後することができますナビゲーションプロパティを使用してクエリを実行します。

public List<CustomUser> GetActiveCustomuser() 
{ 
    return context.Users 
     .Where(u => u.Active) 
     .Select(new CustomUser() 
      { 
       Name = u.Name, 
       Place = new CustomPlace() { Name = u.Place.Name } 
      }) 
     .ToList(); 
} 
+0

申し訳ありませんが、私の質問ではっきりしていないかもしれませんが、クエリ可能なコレクション(いくつかの選択肢を作るため)が必要で、ナビゲーションは怠惰でなければなりません – VVildVVolf