ASP.NET使用自定义表达式过滤IQueryable

时间:2017-12-07 10:53:30

标签: c# linq

我目前正在研究.NET 4.5中的ASP.NET应用程序。目前,我正在使用IQueryable

从我的数据库中检索2个查看结果
  1. MainProject
  2. 子项目
  3. MainProjectSubProject具有不同的属性,但共有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方法放入扩展方法?

1 个答案:

答案 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);