2016-01-21 53 views
0

在我的數據訪問層條款,我打電話GET方法具有以下Lambda表達式:LINQ表達式,其中與通用型

public List<T> Get<T>() where T : class { var list = Context.Set<T>().ToList().Distinct().Where(x => x.Content_type == "Test"); return list; }

但得到錯誤

「無法解析符號Content_type「

我該如何解決這個問題?

+0

一個方面說明:你應該以相反的順序連接調用 - 「Where」然後「Distinct」然後「ToList」。 –

+0

thansk @IvanStoev,我是LINQ查詢/ Lambda表達式的新手,仍在學習。只是好奇這將如何改變結果。我驗證了我的數據庫的結果,它是一樣的。 – mukulsharma1146

+1

它不會改變結果,但處理的地方。您編寫它的方式將讀取內存中的所有表記錄,然後執行過濾等操作,而在第二種情況下,將在數據庫內完成所有過濾。 –

回答

0

原因是您知道關於T的全部數據是!它是一個class。您不知道它是否包含Content_type屬性。

如果您總是通過T類包含Content_type的定義,請嘗試以下操作。

Context.Set<T>().ToList().Distinct().Where(x => (x as SomeClassWithContentTypeField).Content_type == "Test");

更好的辦法將是,如果你介紹的接口IHasContentTypeField宣告Content_type財產

public interface IHasContentTypeField 
{ 
    string Content_type { get; set; } 
} 

然後約束T到該接口。

public List<T> Get<T>() where T : IHasContentTypeField 

然後你就可以在您要調用Get<T>方法類實現IHasContentTypeField

public class A : IHasContentTypeField 
{ 
    public string Content_type { get; set; } 
} 
+0

問題是,在我的情況下,類型T可能有兩種可能性,幸運的是這兩種類型都有字段內容類型。 – mukulsharma1146

+0

@pikachu相當不錯,在他們兩個中實現'IHasContentTypeField'接口。你很好走。 – tchelidze

+0

我對這個接口有點困惑,在我的情況下,可以有多個類,其中一個屬性爲Content_type。你能否更詳細地解釋一下。 – mukulsharma1146

2

的問題是,Content_type不是T類的一部分,因爲它只是一個類。

由於@tchelidze說,您可以在功能設置where子句指定類型,就像這樣:

public List<T> Get<T>() where T : IYourCommonInterface 
{ 
    var list = Context.Set<T>().Where(x => x.Content_type == "Test").Distinct().ToList(); 
    return list; 
} 

但是,如果你需要完全以通用的,你可以選擇將函數添加像這樣:同樣

Get(x => x.Content_type); 

,如果你想走得更遠:

public List<T> Get<T>(Func<T, object> selector) where T : class 
{ 
    var list = Context.Set<T>().Where(x => selector(x) == "Test").Distinct().ToList(); 
    return list; 
} 

並使用它像,你可以通過整個條件:

public List<T> Get<T>(Func<T, bool> condition) where T : class 
{ 
    var list = Context.Set<T>().Where(condition).Distinct().ToList(); 
    return list; 
} 

而且使用這樣的:

Get(x => x.Content_type == "test"); 

希望它能幫助。