我有以下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; }
}
我想查询数据库以返回List,但仅限于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;
我总是在其他地方使用方法语法,为了保持一致性,我们不希望只使用这一个使用查询语法的方法,但是我无法使用方法语法来完成同样的工作。
答案 0 :(得分: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);
答案 1 :(得分: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)
);
答案 2 :(得分:0)
keyup