2017-08-16 6 views
0

私が持っている次のエンティティを含むDBからエンティティを取得する方法ナビゲーションプロパティと子リスト総量

public class Objective 
{ 
    public virtual UserInfo AssignedUser { get; set; } 
    public int? AssignedUserID { get; set; } 
    public string ObjectiveText { get; set; } 
    public virtual ICollection<ObjectiveTask> Tasks { get; set; } 
    public virtual UserInfo User { get; set; } 
    public int UserID { get; set; } 
} 

一つの目的でしつの割り当てられたユーザーと、1人のユーザーが、多くのタスクを持っています。私はこの

(from objective in context.Set<Objective>() select objective) 
.Include(o => o.User) 
.Include(o => o.AssignedUser) 
.ToListAsync(); 
ようなクエリでこれを行うと

DBからエンティティを取得した後、私はこの

public class ObjectiveListViewModel 
{ 
    public string AssignedString { get; set; } 
    public string ObjectiveText { get; set; } 
    public int TasksCount { get; set; } 
    public string UserContactName { get; set; } 
} 

マッピングの設定のように見えるDTOクラスにマップメーター

はしていません

すべてがクールです - ユーザーと割り当てられたユーザーのプロパティが読み込まれ、データを取得するためにDBに余分なクエリを行う必要はありません。

しかし、私は仕事の量で目標を返す必要があります。 は、私が作成したジェネリッククラス

public class EntitySubCount<TEntity> 
{ 
    public TEntity Entity { get; set; } 
    public int GroupCount { get; set; } 
} 

これを行うと、このようにそれを使用するには

(from objective in context.Set<Objective>() select objective) 
.Include(o => o.User) 
.Include(o => o.AssignedUser) 
.Select(o=> new EntitySubCount<Objective> { 
    Entity = o, 
    GroupCount = o.Tasks.Count }) 
.ToListAsync(); 

しかし、ユーザーと割り当てられたユーザーのプロパティがロードされていない、それが取得するためにDBへの追加のクエリを必要とし、そのデータ。 私はそれが怠惰な読み込みのためにそれを理解します。

質問は - 私はどのようにDBから取得することができますエンティティロードされたナビゲーションと。プロパティとタスクの数を同時に表示しますか?

ありがとうございました

答えて

1

あなたは近くです。あなたが投げている場合は、インクルードの必要はありません。この場合、私は匿名型にプロジェクトを作成しますが、必要に応じてプロジェクトにViewModelクラスを作成することができます。

var objectiveList = context.Objectives 
    .Select(o => new 
    { 
     Entity = o, 
     // or you could just pick the properties: 
     ObjectiveText = o.ObjectiveText, 
     User = o.User, 
     AssignedUser = o.AssignedUser, 
     GroupCount = o.Tasks.Count 
    }).ToList(); 

EDIT:既にViewModel(DTO)があります。あなたは次のようなものを探しているかもしれません:

var objectiveList = context.Objectives 
    .Select(o => new ObjectiveListViewModel 
    { 
     AssignedString = o.AssignedUser.Name, 
     ObjectiveText = o.ObjectiveText, 
     TasksCount = o.Tasks.Count 
     UserContactName = o.User.Name 
    }).ToList(); 
+0

はい、それは動作し、私はこの解決策について知っています。クエリ結果をDTOに投影することを避けることができれば、私は考えていました。しかし、新しいものを発明せず、簡単で実用的なソリューションを使用する方が良いかもしれません。 – Nikolay

+0

もう1つの方法は、エンティティを取得してからAutomapperのようなツールを使用してDTO/ViewModelに入力することです。実際には、 '.Project()。To 'で1ステップで実行できる[拡張](https://github.com/AutoMapper/AutoMapper/wiki/Queryable-Extensions)があります。 –

+0

ありがとうSteve。 Automapperをプロジェクトで使用して、エンティティをWebプロジェクトのViewModelsにマップしますが、IQueryableで動作するかどうかはわかりません。ありがとう、それは私のための新しい機会を開きます:) – Nikolay

関連する問題