通用自定义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来筛选表达式。。。
简单地说:返回一个表达式,该表达式将根据卖家参数过滤该表,卖家参数可以是"大"、"小"等。
我认为这符合您的描述。
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;
}