如何将此 LINQ to Entities 查询转换为 'Method Syntax' 而不是 'Query Syntax'

How to convert this LINQ to Entities query into 'Method Syntax' instead of 'Query Syntax'

我有以下 2 个 EF 型号:

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; }
}

我想根据相关的 RuleId 以及指定的 ApplicationId 和网站编号。最终,考虑到任何 Application/Site 特定排除项,以便不将这些规则包含在我 return.

的结果中

到目前为止,我已经能够使用以下查询实现此目的:

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;

我总是在其他任何地方都使用方法语法,为了保持一致性,我宁愿不要只使用这种使用查询语法的方法,但我一直无法使用方法语法来实现同样的事情。

为什么不导航到此规则的排除项 (r.Exclusions) 而不是所有排除项 (context.Exclusions),然后根据当前规则进行过滤?这很落后

如果我理解你的要求,你应该这样做:

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

直接翻译:

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);

但是你当然可以省略带有恒等函数的 select(就像编译器可能会做的那样):

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)
    );
 var query =   context.Rule.Where(r => r.IsActive && !context.Exclusion.Any(e => e.ApplicationId == applicationId && e.SiteId==siteId && r.Id==e.RuleId))