对单个子实体使用表达式 LINQ to SQL

问题描述 投票:0回答:0

我第一次深入研究表达式是为了减少代码重复。

我创建了 2 个表达式函数来隔离 2 个独立实体的工作。

  • 网站
  • 站点服务器
public class CMSite
{
   public int ID {get;set;}
   public string Name {get;set;}
   public ICollection<CMSiteServer> SiteServers { get; set; }
}

public class CMSiteServer
{
   public int ID {get;set;}
   public string Name {get;set;}
   public int SiteID {get;set;}
   [ForeignKey("CMSite")]
   public decimal SiteID { get; set; }
   public CMSite Site {get;set;}
}

关系是1个站点=多个站点服务器

每个站点和服务器都有一系列属性,我创建了各种过滤器对象以允许搜索这些实体。

用例:

  1. 搜索包含属性为 x 的服务器的站点
  2. 包含具有属性 x
  3. 的站点的搜索服务器

我的代码包含以下方法:

public static Expression<Func<CMSiteServer, bool>> GetServerExpression(CMSiteServerFilter filter, bool Active) {
   ...
}

public static Expression<Func<CMSite, bool>> GetSiteExpression(CMSiteFilter filter, bool Active) {
   ...
}

我可以用这种方法解决用例 1:

    public static IQueryable<CMSite> ApplyQueryFilterServer(this IQueryable<CMSite> qry, CMSiteServerFilter filter, bool Active)
    {
        if (filter == null)
            return qry;


        var exp = GetServerExpression(filter, Active);
        qry = qry.Where((s) => s.CMSiteServers.AsQueryable().Any(exp));

        return qry;
    }

但是,我找不到用例 2 的等效项。

    public static IQueryable<CMSite> ApplyQueryFilterSite(this IQueryable<CMSiteServer> qry, CMSiteFilter filter, bool Active)
    {
        if (filter == null)
            return qry;


        var exp = GetServerExpression(filter, Active);

        // this is the piece that won't work:
        qry = qry.Where((s) => s.CMSite.AsQueryable().Any(exp));

        return qry;
    }

因为 Server.CMSite 是单数的,所以“AsQueryable”将不起作用

我试图避免为每个 IQueryable 源元素定义一次我的所有过滤条件。

entity-framework linq linq-to-sql expression
© www.soinside.com 2019 - 2024. All rights reserved.