C# 通用自定义linq滤波器
如何创建一个自定义的泛型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
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);
复述