C# 通用自定义linq滤波器

C# 通用自定义linq滤波器,c#,linq,.net-3.5,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.GetTy

如何创建一个自定义的泛型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;
    }
公共静态IQueryable GetAllByType(
此IQueryable customQuery,字符串卖方)其中T:class,new()
{
customQuery=customQuery.Where(i=>i.GetType().Name==“TypeOfSeller”);
返回自定义查询;
}
如果表T上的属性类型存在,那么我想使用作为参数传入的字符串seller过滤表达式


简单地说:返回一个表达式,该表达式将通过seller参数过滤该表,该参数可以是“大”、“小”等。

我将对其进行重构,以便不涉及“如果”,但我只发送符合该方法的实体

接下来要考虑的是,如果有多个共享属性名称的实体模型,并且希望共享关于该属性名称的逻辑,则使用代码生成类的部分方面扩展这些类并使它们中的每一个都实现接口。

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

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

我将对其进行重构,以避免出现“如果”但我只发送符合该方法的实体

接下来要考虑的是,如果有多个共享属性名称的实体模型,并且希望共享关于该属性名称的逻辑,则使用代码生成类的部分方面扩展这些类并使它们中的每一个都实现接口。

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

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

我认为这就是您所描述的

    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;
            }
        }
    }
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间控制台应用程序3
{
班主任
{
公共字符串名称{get;set;}
公共字符串TypeOfSeller{get;set;}
}
分类其他数据
{
公共字符串名称{get;set;}
}
静态类程序
{
静态void Main(字符串[]参数)
{
列表卖家=新列表();
sellers.Add(newseller(){Name=“A”,TypeOfSeller=“Test”});
sellers.Add(newseller(){Name=“B”,TypeOfSeller=“Test”});
sellers.Add(newseller(){Name=“C”,TypeOfSeller=“Other”});
var q=来自sellers.AsQueryable()中的p。GetAllByType(“测试”)选择p;
List other=新列表();
添加(newsomeotherdata(){Name=“A”});
添加(newsomeotherdata(){Name=“B”});
添加(newsomeotherdata(){Name=“C”});
var q2=来自other.AsQueryable()中的p。GetAllByType(“测试”)选择p;
foreach(q中的变量x)
Console.WriteLine(x.Name+“,”+x.TypeOfSeller);
Console.WriteLine(“其他数据:”);
foreach(第二季度的var x)
Console.WriteLine(x.Name);
Console.ReadLine();
}
公共静态IQueryable GetAllByType(此IQueryable customQuery,字符串卖方),其中T:class,new()
{
var prop=typeof(T).GetProperty(“TypeOfSeller”);
如果(prop!=null)
customQuery=customQuery.Where(i=>prop.GetValue(i,新对象[]{}).ToString()==seller);
返回自定义查询;
}
}
}
输出为:

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

    • 我想这正是你所描述的

          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;
                  }
              }
          }
      
      使用系统;
      使用System.Collections.Generic;
      使用System.Linq;
      使用系统文本;
      命名空间控制台应用程序3
      {
      班主任
      {
      公共字符串名称{get;set;}
      公共字符串TypeOfSeller{get;set;}
      }
      分类其他数据
      {
      公共字符串名称{get;set;}
      }
      静态类程序
      {
      静态void Main(字符串[]参数)
      {
      列表卖家=新列表();
      sellers.Add(newseller(){Name=“A”,TypeOfSeller=“Test”});
      sellers.Add(newseller(){Name=“B”,TypeOfSeller=“Test”});
      sellers.Add(newseller(){Name=“C”,TypeOfSeller=“Other”});
      var q=来自sellers.AsQueryable()中的p。GetAllByType(“测试”)选择p;
      List other=新列表();
      添加(newsomeotherdata(){Name=“A”});
      添加(newsomeotherdata(){Name=“B”});
      添加(newsomeotherdata(){Name=“C”});
      var q2=来自other.AsQueryable()中的p。GetAllByType(“测试”)选择p;
      foreach(q中的变量x)
      Console.WriteLine(x.Name+“,”+x.TypeOfSeller);
      Console.WriteLine(“其他数据:”);
      foreach(第二季度的var x)
      Console.WriteLine(x.Name);
      Console.ReadLine();
      }
      公共静态IQueryable GetAllByType(此IQueryable customQuery,字符串卖方),其中T:class,new()
      {
      var prop=typeof(T).GetProperty(“TypeOfSeller”);
      如果(prop!=null)
      customQuery=customQuery.Where(i=>prop.GetValue(i,新对象[]{}).ToString()==seller);
      复述