如何将此LINQ转换为实体查询到'方法语法'而不是查询语法'

时间:2016-05-18 11:10:10

标签: c# .net entity-framework linq linq-to-entities

我有以下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;

我总是在其他地方使用方法语法,为了保持一致性,我们不希望只使用这一个使用查询语法的方法,但是我无法使用方法语法来完成同样的工作。

3 个答案:

答案 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