如何创建自定义通用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上的属性类型存在,那么我想使用作为参数传入的字符串卖方来过滤表达式...
简单地说:返回一个表达式,该表达式将由卖家参数过滤此表,该表可能是“大”,“小”等。
答案 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;
}
}
}
输出结果为:
答案 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;
}