gpt4 book ai didi

c# - Linq Entity Framework 泛型过滤方法

转载 作者:行者123 更新时间:2023-11-30 13:52:05 24 4
gpt4 key购买 nike

我有一些方法可以对来 self 的实体的数据执行标准过滤(使用 Entity Framework v4)。

示例#1:

protected IQueryable<Database.Product> GetActiveProducts( ObjectSet<Database.Product> products ) {

var allowedStates = new string[] { "Active" , "Pending" };

return (
from product in products
where allowedStates.Contains( product.State )
&& product.Hidden == "No"
select product
);

}

示例 #2:

protected IQueryable<Database.Customer> GetActiveProducts( ObjectSet<Database.Customer> customers ) {

var allowedStates = new string[] { "Active" , "Pending" };

return (
from customer in customers
where allowedStates.Contains( customer.State )
&& customer.Hidden == "No"
select customer
);

}

如您所见,除了它们所操作的实体类型之外,这些方法是相同的。我有超过 10 种这样的方法,一种用于我系统中的每种类型的实体。

我试图了解我如何拥有 1 个单一方法,我可以为其传入任何实体类型,并让它在 2 个字段/属性存在的情况下执行 where 子句。

我没有在数据库中使用Inheritance,所以就系统而言,巧合的是每个Entity类型都有“Hidden”和“State”字段。

我的谷歌搜索告诉我它与使用 Expression.Call() 构建代码有关,但我现在头晕目眩!

最佳答案

我想说添加接口(interface)比搞乱表达式树反射更简单。 EF 实体是部分类,因此您应该能够执行以下操作:

已更新以包含类约束(请参阅 Mark 的评论)

public interface IHideable
{
string State { get; }
string Hidden { get; }
}

...

namespace Database
{
public partial class Product : IHideable { }
public partial class Customer : IHideable { }
}

...

protected IQueryable<T> GetActive<T>(ObjectSet<T> entities)
where T : class, IHideable
{
var allowedStates = new string[] { "Active" , "Pending" };

return (
from obj in entities
where allowedStates.Contains(obj.State)
&& obj.Hidden == "No"
select obj
);
}

关于c# - Linq Entity Framework 泛型过滤方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3220155/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com