通用自定义linq过滤器

时间:2011-06-16 12:11:41

标签: c# linq .net-3.5

如何创建自定义通用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上的属性类型存在,那么我想使用作为参数传入的字符串卖方来过滤表达式...

简单地说:返回一个表达式,该表达式将由卖家参数过滤此表,该表可能是“大”,“小”等。

3 个答案:

答案 0 :(得分:3)

我认为这就是你所描述的。

    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

答案 1 :(得分:2)

我会稍微重构一下,以便不涉及“if”,但我只发送符合该方法的实体。

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

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

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

答案 2 :(得分:0)

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

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;
}