在我的數據訪問層條款,我打電話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「
我該如何解決這個問題?
在我的數據訪問層條款,我打電話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「
我該如何解決這個問題?
原因是您知道關於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; }
}
問題是,在我的情況下,類型T可能有兩種可能性,幸運的是這兩種類型都有字段內容類型。 – mukulsharma1146
@pikachu相當不錯,在他們兩個中實現'IHasContentTypeField'接口。你很好走。 – tchelidze
我對這個接口有點困惑,在我的情況下,可以有多個類,其中一個屬性爲Content_type。你能否更詳細地解釋一下。 – mukulsharma1146
的問題是,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");
希望它能幫助。
一個方面說明:你應該以相反的順序連接調用 - 「Where」然後「Distinct」然後「ToList」。 –
thansk @IvanStoev,我是LINQ查詢/ Lambda表達式的新手,仍在學習。只是好奇這將如何改變結果。我驗證了我的數據庫的結果,它是一樣的。 – mukulsharma1146
它不會改變結果,但處理的地方。您編寫它的方式將讀取內存中的所有表記錄,然後執行過濾等操作,而在第二種情況下,將在數據庫內完成所有過濾。 –