通用自定义linq筛选器

本文关键字:筛选 linq 自定义 | 更新日期: 2023-09-27 17:59:13

如何创建一个自定义的泛型linq过滤器,该过滤器将检查泛型类是否包含属性名称并返回查询。。。

我有这样的东西:

    public static IQueryable<T> GetAllByType<T>(
        this IQueryable<T> customQuery, string seller) where T : class, new()
    {
        customQuery = customQuery.Where(i => i.GetType().Name == "TypeOfSeller");
        return customQuery;
    }

如果表T上的属性类型存在,那么我想使用作为参数传入的字符串seller来筛选表达式。。。

简单地说:返回一个表达式,该表达式将根据卖家参数过滤该表,卖家参数可以是"大"、"小"等。

通用自定义linq筛选器

我认为这符合您的描述。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace ConsoleApplication3
    {
        class Seller
        {
            public string Name { get; set; }
            public string TypeOfSeller { get; set; }
        }
        class SomeOtherData
        {
            public string Name { get; set; }
        }
        static class Program
        {

            static void Main(string[] args)
            {
                List<Seller> sellers = new List<Seller>();
                sellers.Add(new Seller() { Name = "A", TypeOfSeller = "Test" });
                sellers.Add(new Seller() { Name = "B", TypeOfSeller = "Test" });
                sellers.Add(new Seller() { Name = "C", TypeOfSeller = "Other" });
                var q = from p in sellers.AsQueryable<Seller>().GetAllByType("Test") select p;
                List<SomeOtherData> other = new List<SomeOtherData>();
                other.Add(new SomeOtherData() { Name = "A" });
                other.Add(new SomeOtherData() { Name = "B" });
                other.Add(new SomeOtherData() { Name = "C" });
                var q2 = from p in other.AsQueryable<SomeOtherData>().GetAllByType("Test") select p;
                foreach (var x in q)
                    Console.WriteLine(x.Name + ", " + x.TypeOfSeller);
                Console.WriteLine("Other Data: ");
                foreach (var x in q2)
                    Console.WriteLine(x.Name);

                Console.ReadLine();
            }
            public static IQueryable<T> GetAllByType<T>(this IQueryable<T> customQuery, string seller) where T : class, new()
            {
                var prop = typeof(T).GetProperty("TypeOfSeller");
                if(prop != null)
                  customQuery = customQuery.Where(i => prop.GetValue(i, new object[] {}).ToString() == seller);
                return customQuery;
            }
        }
    }

输出为:

  • A、 测试
  • B、 测试
  • 其他数据:
  • A
  • B
  • C

我会对它进行一点重构,这样就不会涉及"if",而是只发送符合该方法的实体。

接下来要考虑的是,如果有多个实体模型共享一个属性名称,并且您希望共享有关该属性名称的逻辑,请利用代码生成类的partial方面来扩展这些类,并让每个类实现一个接口。

interface ISeller 
{
    string TypeOfSeller { get; set; }
}

这将允许您将接口添加到方法的约束列表中,还允许您直接使用TypeOfSeller属性,而无需尝试使用其他方法(如反射)。

这个问题不是很清楚,但听起来你想要这样的

public static IQueryable<T> GetAllByType<T>(
    this IQueryable<T> customQuery, string seller) where T : class, new()
{
    return from i in customQuery
                let prop = typeof(T).GetProperty("SellerType")
                where prop != null && prop.GetValue(i, null).Equals(seller) 
                select i;
}
相关文章: