2017-06-29 286 views
0

我有一些使用實體框架的遺留代碼。實體框架

當我調試代碼時,我可以看到EF DbContext包含整個表格。它被OData傳遞到前端,然後進行角度處理。

所以我試圖搜索,是否有可能通過EF獲得單個記錄?

無處不在我看到SingleOrDefault方法或其他IQueryable,但據我瞭解,這些都是collections的一部分。

Microsoft說:如果集合不包含元素,有時默認值(TSource)不是您要使用的默認值。

這是否意味着EF總是從表中獲取所有數據,以後我可以使用它們?

或者有沒有辦法強制內部查詢獲取只有一個,只有一行?

我們正在使用postgresql。

+0

你試過'.Take(1)',還是我誤會了你? –

+1

你的問題沒有意義。是的,你可以在任何你想要的地方調用'Single()'和其他方法。 – SLaks

+0

並且將是內部查詢'SELECT * FROM table WHERE id = 23'? – vaso123

回答

1

使用實體框架,您可以使用LINQ運行查詢並獲取單個記錄或有限集。但是,在.NET項目中,控制器應該先解析OData查詢參數並過濾數據集,然後再將結果返回給客戶端應用程序。請檢查您的控制器代碼對照this tutorial,看看你是否可能錯過了一些東西。

如果您以某種方式繞過內置的OData框架,可能會有所幫助的是瞭解立即執行哪些查詢與哪些查詢被延遲。請參閱以準確瞭解哪些操作將強制訪問數據庫,並儘可能延遲立即執行的任何操作。

+0

我認爲這是我需要的。我在檢查時只需要一天。如果'public SingleResult Get([FromODataUri] int key)'有效,我會接受它。給予好評。 – vaso123

+0

@ vaso123謝謝,別忘了添加'''[EnableQuery]'裝飾器,以便ASP.Net可以自動分析OData查詢參數 – RemedialBear

+0

感謝您的鏈接。 – vaso123

1

不,如果您正確使用,EF將不會將整個表選擇到內存中。正確地;我的意思是:

context.Table.First(); 

將轉化爲一個SQL查詢,只返回一個行,那麼這將映射到一個對象返回到調用代碼。這是因爲上面的代碼使用LINQ-to-Entities。如果你不喜歡的東西這個代替:

context.Table.ToList().First(); 

然後整個表選擇使ToList工作,LINQ到對象處理First。所以只要你用懶惰的枚舉來做你的查詢(沒有提前實現結果),你會沒事的。

+2

如果您使用的是ASP.NET MVC OData,那麼您的控制器將返回基本查詢,並且客戶端傳遞的URI將與您從控制器返回的查詢合成,然後將其轉換爲SQL並執行。 –

+0

@ DavidBrowne-Microsoft Performance是我們企業項目的瓶頸。我是C#和ASP.NET的新手,我們有時間去探索我們的代碼。我很傷心,我們正在使用postgre。你有什麼建議?我們應該編寫自己的數據庫層(比如'Db.getRow(sqlCmd)'),包含'SELECT field1,field2 FROM users WHERE id = 242'(什麼是給我們返回1行)還是EF可能?並降低EF和OData – vaso123

+0

「你推薦什麼?」瞭解如何有效使用EF和OData。 –