我目前正在研究.NET 4.5中的ASP.NET应用程序。目前,我正在使用IQueryable
MainProject
和SubProject
具有不同的属性,但共有1个属性,ObjectNumber
,我在接口ISearchResult
中定义。
我想编写一个表达式,只用一种方法过滤两个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; }
}
在我的Code Behind类中,我有我的过滤方法,如下所示:
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
吗?
是否可以将此Expression Filter方法放入扩展方法?
答案 0 :(得分:0)
使用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);