2017-08-25 95 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

編輯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核心2.0)。解決方案是投影('select')查詢。 –

+0

嗨伊凡,你能展示一個投影查詢的例子嗎? – 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