2016-05-18 119 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

相关问题