如何将此 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))
我有以下 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))