[英]Return datatype of a linq query
我有一個函數返回一個對象,該對象表示我的數據庫中的記錄以及其他列。 我沒有為這個對象創建一個單獨的類,而是想知道是否還有其他方法,例如:
public object GetRecord(string key)
{
var item = select new {column1, column2};
return item;
}
public void main()
{
var item = GetRecord(1);
// I want to be able to reference column1 on item.
var x = item.column1;
}
是的,還有其他方法(實際上有很多),但我強烈建議你不要使用它們中的任何一種。 處理此案例的最佳選擇是創建一個新的自定義類型,該類型保留您擁有的數據。 它將是迄今為止最易維護的選擇。
匿名類型專門設計用於單個方法的范圍內。 你正在與其他方面的功能設計作斗爭,因此很難做到,你很可能會失去智能感知,性能很可能會受到影響,而且需要回來維護代碼的糟糕悶棍會不知道發生了什么或如何調整查詢。
大多數備用解決方案的主要問題是您丟失了編譯時檢查。 如果查詢刪除參數,添加參數,更改類型等,則使用它的代碼無法知道。 在編寫代碼以使用查詢時,您無法知道所有數據是什么,它們的類型是什么,變量的名稱是什么等等。您需要擔心編譯器可以在變量名稱中輸入拼寫錯誤。抓住,你將始終需要查看生成查詢的方法的內部工作。 你失去了將其視為黑匣子或抽象的能力,這很重要。
如果您擔心創建這些自定義類型所需的時間和精力,那么有許多自動化工具可用於基於數據庫表或其他來源生成此類。
如果是.net 4.0,請使用dynamic關鍵字。
public dynamic GetRecord(string key)
{
var item = select new {column1, column2};
return item;
}
此外,如果它是.net 4.0,您可以使用Tuple<object,object>
然后按item.Item1
引用它。 您可以使用對象的鍵入而不是簡單的object
。
public Tuple<Column1Type,Column2Type> GetRecord(string key)
{
var item = select new Tuple<Column1Type,Column2Type>(column1, column2);
return item;
}
只有補充其他答案,你也可以使用泛型來做到這一點。 這樣的事情:
public T GetRecord<T>(string key)
where T : IAnyInterfaceWithProperties, new
{
var item = select new T { PropertyOfInterface = value, Property2 = value2 };
return item;
}
您可以考慮使用POCO庫 - 將完全按照您的要求進行操作。
您可以自己滾動或使用已有的:
http://code.google.com/p/dapper-dot-net/
您的代碼看起來像這樣:
var result = connection.Query("select col1, col2 from table1");
var x = result[0].col1;
Drapper還可以讓你有一個強大的類型,例如:
var result = connection.Query<myType>("select col1, col2 from table1");
' Now result is a list of myType
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.