ASP.NET 使用自定义表达式筛选 IQueryable



我目前正在开发 .NET 4.5 中的 ASP.NET 应用程序。目前,我正在使用IQueryable从数据库中检索 2 个查看结果:

  1. 主项目
  2. 子项目

MainProjects 和SubProjects 具有不同的属性,但确实有 1 个共同的属性,即我在接口ISearchResult中定义的ObjectNumber

我想编写一个表达式来仅使用 1 种方法过滤两个 View 结果,而不是两次编写相同的编码。

我的视图结果类和界面如下所示:

public interface ISarchResult
{
int ID { get; set; }
string ObjectNr { get; set; }
}
public class MainProject : ISearchResult
{
public int ID { get; set; }
public DateTime? CreationDate { get; set; }
public string Title { get; set; }
public string ObjectNr { get; set; }
}
public class SubProject : ISuchResultat
{
public int ID { get; set; }
public string ObjectNr { get; set; }
public short State { get; set; }
public int? Anything { get; set; }
public int? Something { get; set; }
}

在我的代码隐藏类中,我有我的过滤器方法,它看起来像这样:

private IQueryable<MainProject> FilterObjectNumbers(IQueryable<MainProject > result)
{
var objectNumbers = this.objectNrField.Text.Split(',').Select(objNr => objNr.Trim()).Where(t => !string.IsNullOrEmpty(t)).ToList();
if (objectNumbers.Count > 0)
{
var projectIDs = objectNumbers.Select(objNr => Util.StringToInt(objNr)).Where(objNr => objNr > 0).ToList();
result = result.Where(i => objectNumbers.Contains(i.ObjectNr) || projectIDs.Contains(i.PK_ID));
}      
return result;
}

您知道如何将此方法转换为查询表达式,以过滤我的IQueryable类型MainProject以及类型SubProject吗?

是否可以将此表达式筛选器方法放入扩展方法中?

创建具有ISarchResult约束的泛型扩展方法

public static IQueryable<T> FilterObjectNumbers<T>(this IQueryable<T> result, string objectNrFieldText)
where T : ISarchResult {
var objectNumbers = objectNrFieldText.Split(',').Select(objNr => objNr.Trim()).Where(t => !string.IsNullOrEmpty(t)).ToList();
if (objectNumbers.Count > 0) {
var projectIDs = objectNumbers.Select(objNr => Util.StringToInt(objNr)).Where(objNr => objNr > 0).ToList();
result = result.Where(i => objectNumbers.Contains(i.ObjectNr) || projectIDs.Contains(i.ID));
}      
return result;
}

然后可以使用

//assuming IQueriable<MainProject> mainProjectResult
var filteredResult = mainProjectResult.FilterObjectNumbers(this.objectNrField.Text);

最新更新