2011-12-16 25 views
2

在我的數據庫中,我擁有屬性爲int DeleteState的表。我想要一個通用的方法來查詢這些表。換句話說,這樣做的方法是:Context.Table.Where(x => x.DeleteState == 0)實體框架中的通用查詢方法

我想我能做到這一點:

public static class Extensions 
{ 
    public static IQueryable<T> Exists<T>(this IQueryable<T> qry) where T : IDeletable 
    { 
    return qry.Where(x => x.DeleteState == 0); 
    } 
} 

哪裏IDeletable是這樣的:

public interface IDeletable 
{ 
    int DeleteState { get; set; } 
} 

現在我只需要添加在EF模式IDeletable

public partial class Table : EntityObject, IDeletable { ... } 

我使用模板機制來做到這一點。

不幸的是,它不工作:(它編譯罰款,但在運行時拋出:

Unable to cast the type 'Table' to type 'IDeletable'. LINQ to Entities only supports casting Entity Data Model primitive types

,如果我把它叫做這樣的:

Context.Table.Exists(); 

我怎樣才能解決這個問題問題?你能想到一個修復或不同的方法來實現類似的結果嗎?Thx

回答

0

你的問題是,實體框架只能窩rk與表達式樹。您的函數直接執行查詢,而不是構建表達式樹。

更簡單的解決方案是添加一個Model Defined Function

模型定義的函數可以直接調用您的上下文的實例。

+0

Thx,hi hi NT。 – duedl0r 2011-12-16 10:06:59

0

在您真正查詢之前,您是否嘗試過將對象轉換爲IDeletable?例如

public static IQueryable<T> Exists<T>(this IQueryable<T> qry) 
{  
    return qry.Select<T, IDeletable>(x => x).Where(x => x.DeleteState == 0).Cast<T>(); 
} 

我沒有測試此代碼,但是,錯誤鈴響了,我記得我不得不做類似的事情。

+0

嗯,我得到相同的運行時異常。另一個缺點是,我從選擇中獲得了不同的類型。這不是T,而是IDeletable,對吧? – duedl0r 2011-12-16 10:06:46

+0

@ duedl0r - 是的,但你總是可以把它投回`Where(x => x.DeleteState == 0).Cast ()`。看到我更新的源代碼,如果你仍然強迫T在方法聲明中是'IDeletable`,你仍然會遇到問題。 – James 2011-12-16 10:14:41

0

可能:

public static IQueryable<T> Exists<T>(this IQueryable<T> qry) 
{ 
    return qry.Where(x => (!typeof(IDeletable).IsAssignableFrom(x.GetType()) || typeof(IDeletable).IsAssignableFrom(x.GetType()) && ((IDeletable)x).DeleteState == 0)); 
}