簡體   English   中英

從表中選擇特定列,實體框架

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM