[英]Select specific columns from table, Entity Framework
我有一個關於使用實體框架從表中選擇特定列的問題。 問題是,我使用Find()
方法通過主鍵獲取所需的表,然后從中獲取一些數據。
我有一個包含大量列的表,如果我調用Find()
方法,它將返回該行的所有列,但我只想使用例如來自 2 列的數據。
MyTable table = context.MyTable.Find(id); //Get MyTable object from context, id = primary key
string p1 = table.Prop1;
string p2 = table.Prop2;
這將返回填充了所有(例如,它具有 Prop1、Prop2、...、PropN)屬性的單個對象(如果它已填充到數據庫中)。 所以我知道我可以使用匿名對象或數據傳輸對象 (DTO),但是 [問題 1] 有沒有其他(但簡單的)方法來獲取特定列? [問題 2] 如果我使用Find()
(或者我應該使用Where()/Select()
)是否會影響性能?
var items = context.MyTable.Where(x => x.Id == id)
.Select(x => new
{
P1 = table.Prop1,
P2 = table.Prop2
});
這將轉化為一個 sql 調用,如:
SELECT p.Prop1, p.Prop2 FROM mytable p WHERE p.Id = id
使用數據傳輸對象: DTO ,這是一種推薦的微軟模式。
簡單來說,它們只是保存數據的對象。
然后像有人建議的那樣做:
public class MyDto
{
public string Prop1 {get;set;} = String.Empty
public string Prop2 {get;set;} = String.Empty
}
MyDto x = new MyDto();
x = context.MyTable.Where(x => x.Id == id)
.Select(x => new MyDto
{
P1 = table.Prop1
//I don't want prop 2, for example
});
並繞過對象。 設置自動屬性( C# 6及更高版本)的默認值並僅初始化您想要的屬性。
編輯:我讀過你不想使用匿名和 DTO,那么你想怎么做。 您可以使用對象或匿名。
其他方法只是構建一個分層結構並在需要的地方直接調用查詢方法。 模式存在是有原因的。
您可以調用針對動態對象的查詢。 有了這些,您可以分配將在運行時解析的字段,代價是失去強類型。
您可能還想檢查使用動態是否具有性能價值。
另一種選擇是將類投影回自身,並且只提供您想要的列。
var table = context.MyTable.Where(mt => mt.Id == id)
.Select(mt => new MyTable
{
Prop1 = mt.Prop1,
Prop2 = mt.Prop2
})
.FirstOrDefault();
string p1 = table.Prop1;
string p2 = table.Prop2;
實際上,您無需創建/維護另一個類即可獲得 DTO 的強類型。 所有未指定的列都將使用列類型的默認值填充。
它在 SQL 中轉換為以下內容:
SELECT TOP(1) m.Prop1, m.Prop2 FROM MyTable m WHERE m.Id = @id
假設您沒有指定所有列,這確實比Find()
提高了性能。
一種簡單的方法是指定匿名類型。 只需將匿名類型視為一種將數據放入對象而不定義對象的方法。 我們可以通過使用“new”運算符並從我們需要的對象中選擇屬性來簡單地做到這一點。
using (var context = new StackOverflowContext())
{
var posts = context.Posts
.Where(p => p.Tags == "<sql-server>")
.Select(p => new {p.Id, p.Title});
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.