我第一次深入到表达式中,将其作为减少代码重复的方法。
我创建了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的服务器的站点
1.搜索包含具有属性x的站点的服务器
我的代码包含以下方法:
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源元素定义一次所有的过滤条件。
1条答案
按热度按时间igetnqfo1#
经过大量的挖掘,我找到了解决我的问题,通过这篇文章:
在c#中将表达式的一部分定义为变量
我添加了一个新的辅助函数:
结合文章中的帮助函数:
此外,我还解决了处理多个过滤条件IEnumerable的相关用例,其中每个条件都是“或”,例如,其中@{}是过滤对象@{Name == 'A'},@{Name == 'B'},@{ID == 4}
应组成以下SQL条件:(名称=“A”或名称=“B”或ID = 4)
上面的“Or”扩展名来自于这篇文章:Combining two expressions (Expression<Func<T, bool>>)