[英]Cast Entity to Implemented Interface in a Generic Method Using LINQ for Entity Framework
[英]Linq Entity Framework generic filter method
我有一些方法對我的實體的數據執行標准過濾(使用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子句。
我不在數據庫中使用繼承,因此就系統而言,每個實體類型都有“隱藏”和“狀態”字段是巧合。
我的谷歌搜索告訴我它與使用Expression.Call()構建代碼有關,但我的頭現在正在旋轉!
我想說添加接口比弄亂表達式樹或反射更簡單。 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
);
}
我想用IQueryable<T>
作為泛型方法的輸入參數類型做同樣的事情。
我得到了“無法轉換類型的運行時異常.... LINQ to Entities僅支持轉換實體數據模型基元類型”。
經過一段時間我認識到,我忘了為泛型參數添加類約束。 但是IQueryable<T>
不需要具有類約束,它仍然需要在運行時解析類型。
如果沒有這篇帖子,我需要幾個小時。 謝謝 :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.