Linq Entity Framework通用过滤方法

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

示例#1:

protected IQueryable GetActiveProducts( ObjectSet 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 GetActiveProducts( ObjectSet 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,因此就系统而言,每个实体类型都有“隐藏”和“状态”字段是巧合。

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

我想说添加接口比弄乱表达式树reflection更简单。 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 GetActive(ObjectSet 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 ); } 

我想用IQueryable作为generics方法的输入参数类型做同样的事情。

我得到了“无法转换类型的运行时exception…. LINQ to Entities仅支持转换实体数据模型基元类型”。

经过一段时间我认识到,我忘了为generics参数添加类约束。 但是, IQueryable不需要具有类约束,它仍然需要在运行时解析类型。

如果没有这篇post,我需要几个小时。 谢谢 :)