我目前正在开发 .NET 4.5 中的 ASP.NET 应用程序。目前,我正在使用IQueryable
从数据库中检索 2 个查看结果:
- 主项目
- 子项目
MainProject
s 和SubProject
s 具有不同的属性,但确实有 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);