2017-08-25 16 views
0

linqクエリに問題があります。 私は3つの実体を持っています: ユーザー、ターゲット、および結果。 ターゲットと可能な結果を​​含むすべてのユーザーを返すクエリが必要です。そして、それは素晴らしい仕事です。しかし今、ターゲットと結果をフィルタリングするフィルタを含めることにしました。したがって、クエリは、これらの基準に一致するユーザー、ターゲット、および結果のみを返します。efコアlinqフィルタリングされた子エンティティ

public class User 
{ 
    public ICollection Targets {get;set;} 
    public string otherProperty {get;set;} 
} 

public class Target 
{ 
    public ICollection Results {get;set;} 
    public User user {get;set;} 
    public string Language {get;set;} 
} 

public class Result 
{ 
    public Target Target {get;set;} 
    public int score {get;set;} 
} 

私を助けることができるEFコアlinqの専門家ですか?

種類のよろしく、 Robrecht

EDIT 1

var query = 
from auditUser in _auditUserRepository.GetAll().Include(u => u.user) 
.WhereIf(!input.Group.IsNullOrWhiteSpace(), u => u.Group == input.Group) 
.WhereIf(!input.Filter.IsNullOrWhiteSpace(), u => u.user.FullName.ToLower().Contains(input.Filter.ToLower())) 
select auditUser; 

var results = query 
.Include(u => u.Targets) 
.ThenInclude(t => t.AuditResults) 
.PageBy(input) 
.ToListAsync(); 

await query 
.SelectMany(u => u.Targets) 
.WhereIf(!input.Language.IsNullOrWhiteSpace(), t => t.Target == input.Language) 
.SelectMany(t => t.AuditResults) 
.WhereIf(input.From != null, r => r.CompletionDate >= input.From) 
.WhereIf(input.To != null, r => r.CompletionDate <= input.From) 
.LoadAsync(); 

これは、私がそう持っているものですが、それは2つの問題がありますため、結果がない場合は

  1. を、ターゲットは含まれていません。それは、左の結合の代わりに内側の結合を含むか、または含めているようです。
  2. これは言語や日付をフィルタリングしません。
+4

現在のクエリといくつかのフィルタ基準の例を表示できますか? –

+0

フィルタリングされたインクルードを意味する場合は、EFでサポートされたことはなく、依然として最新ではありません(最新のEF Core 2.0を含む)。解は射影( 'select')クエリです。 –

+0

こんにちはIvan、投影クエリの例を表示できますか? – user3306290

答えて

0

希望のプロパティでViewModelクラスを作成することをお勧めします。例:

public class UserViewModel 
    { 
    [Display(Name = "Other")] 
    public string otherProperty {get; set;} 
    [Display(Name = "Possible Targets")] 
    public List<Target> targets {get; set;} 
    [Display(Name = "Possible Results")] 
    public List<Result> results{get; set;} 
    } 

次に、「リポジトリ」クラスで、結果をフィルタリングするためのメソッドを作成できます。

public List<UserViewModel> GetUserViewModelBy(int scoreFilter, string filter1= "", string filter2) 
     { 
      IQueryable<Result> query = _context.Results.Where(i => i.score==scoreFilter)).Include(x => x.Target) 
                   .Include(x => x.Target.Results.ToList()) 
                   .Include(x => x.User) 
.Include(x=>x.User.Targets.Where(i=>i.Language.ToLower().Contains(filter1)).ToList()); 

      if (!string.IsNullOrEmpty(filter2)) 
      { 
       query = query.Where(x => x.Target.Language.ToLower().Contains(filter2)); 
      } 

      return query.Select(x => new UserViewModel() 
      { 
       otherProperty = x.User.otherProperty, 
       targets = x.User.targets, 
       results = x.Results 

      }).ToList(); 
     } 
+0

スコアフィルタがオプションの場合、フィルタはどのように見えますか?それが存在しないときは、すべてのユーザーとターゲットにも結果が欲しいと思っています。 – user3306290

関連する問題