簡體   English   中英

Linq 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM