我第一次深入研究表达式是为了减少代码重复。
我创建了 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个站点=多个站点服务器
每个站点和服务器都有一系列属性,我创建了各种过滤器对象以允许搜索这些实体。
用例:
我的代码包含以下方法:
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 源元素定义一次我的所有过滤条件。