2016-05-18 40 views
0

我有以下2種EF型號:如何這個LINQ轉換爲實體查詢到「方法語法」而不是「查詢語法」

public class Rule 
{ 
    public int Id { get; set; } 
    public string RuleValue { get; set; } 
    public bool IsActive { get; set; } 
    public List<Exclusion> Exclusions { get; set; } 
} 

public class Exclusion 
{ 
    public int Id { get; set; } 
    public int ApplicationId { get; set; } 
    public int SiteId { get; set; } 
    public int RuleId { get; set; } 
    [ForeignKey("RuleId")] 
    public Rule Rule { get; set; } 
} 

我想查詢數據庫返回一個列表,但只有在Exclusions表中沒有相關記錄,基於相關的RuleId以及指定的ApplicationId和SiteId。最終,考慮到任何應用程序/網站特定的排除事項,以便在我返回的結果中不包括這些規則。

我已經能夠做到這一點至今使用以下查詢:

IQueryable<Rule> query = 
         from r in context.Rule 
         where r.IsActive && !(from e in context.Exclusion 
               where e.ApplicationId == applicationId && 
e.SiteId == siteId 
               select e.RuleId) 
           .Contains(r.Id) 
         select r; 

我總是使用方法語法其他地方和一致性,不希望有使用查詢語法僅這一個方法,但我無法使用Method Syntax獲得相同的功能。

回答

1

爲什麼不導航到此規則的排除(r.Exclusions)而不是所有Exclusiong(context.Exclusions),然後篩選當前規則?這是非常落後

如果我理解您的要求的權利,你應該做的:

var query = context.Rule 
    .Where(r=>r.IsActive) 
    .Where(r=>!r.Exclusions.Any(e=>e.ApplicationId == applicationId && e.SiteId == siteId); 
+0

我按照你的代碼嘗試了這種方法,但是它返回的結果不正確,但是當我改變它時,那裏不是兩個.Where()子句,而是使用了.Where(r => r.IsActive &&!r.Exclusions .Any(等))然後我開始把結果返回到我的預期。很好,謝謝!我確信在使用查詢語法之前我已經嘗試了這種方法,但是我一定會弄錯它的!再次感謝。 – marcusstarnes

+1

。其中(x).Where(y)等於.Where(x && y)。你應該得到相同的結果 –

0

直接翻譯:

IQueryable<Rule> query = context.Rule 
    .Where(r => r.IsActive && !context.Exclusion 
     .Where(e => e.ApplicationId == applicationId && e.SiteId == siteId) 
     .Select(e => e.RuleId) 
     .Contains(r.Id) 
    ) 
    .Select(r => r); 

但是,當然,你可以省略與身份功能(就像選擇編譯器可能會有):

IQueryable<Rule> query = context.Rule 
    .Where(r => r.IsActive && !context.Exclusion 
     .Where(e => e.ApplicationId == applicationId && e.SiteId == siteId) 
     .Select(e => e.RuleId) 
     .Contains(r.Id) 
    ); 
+0

Missing SiteId? – user6144226

+0

@ user6144226謝謝。固定。 –

0
var query = context.Rule.Where(r => r.IsActive && !context.Exclusion.Any(e => e.ApplicationId == applicationId && e.SiteId==siteId && r.Id==e.RuleId)) 
+1

請嘗試通過添加一些解釋來符合您的代碼,以及爲什麼您認爲它提供瞭解決方案。 – bwegs

相關問題