簡體   English   中英

如何使用Entity Framework 6將Math函數發送到Sql Server

[英]How to send Math functions to Sql Server using Entity Framework 6

我正在嘗試使用實體框架6將數學函數發送到sql服務器。

我有一個簡單的查詢:

using(var db = databaseContext)
{
    var query = db.Foo.Select(x => Math.Sin(x.bar));
}

但是,這給了我一個例外。

EntityFramework.dll中發生類型為'System.NotSupportedException'的異常,但未在用戶代碼中處理

附加信息:LINQ to Entities無法識別方法'Double Sin(Double)',該方法不能轉換為商店表達式。

問題在於實體框架不知道如何將Math.sin轉換為Sql Server等效項。 我還有其他可以使用的類嗎?

我首先要從數據庫加載數據,然后在內存中進行此類計算

using(var db = databaseContext)
{
    var listofFoo= db.Foo.toList();
    var listofFooSin = listofFoo.Select(x => Math.Sin(x.bar));
}

大量的MSSQL特定功能在System.Data.Objects.SqlClient.SqlFunctions類中作為靜態方法公開-但不是全部。 對於Sin您可以使用SqlFunctions.Sin ,而無需使用linq進行對象化。 EF不支持默認Sin功能

您的對象尚未實現,因此無法對其執行復雜的功能。 這與使用擴展方法等類似。 只需在EntityFramework的許多事物中添加一個“ ToList()”的妙處便會使其實現並因此能夠做更多的事情。 如果對Entity有疑問,請使用“ ToList()”。 問題是,當您執行以下操作時,對象無法完全實現:

'context.(object).Select(x => (docomplexThing(x))'

實體具有一些基本屬性和操作,例如均衡操作和可以執行的lambda函數。 在將對象強制轉換為內存中實現程度更高的對象或首先投影至某些對象之前,它無法執行繁重的方法。 ToList完成了此任務。 它不僅是數學運算,而且是加密和定制擴展方法。 有時它們會在某些情況下起作用,但大多數情況下不會起作用。 我一直認為它就像ADO.NET層一樣,在該層中您具有斷開連接的層和連接的層。 上下文和從中獲取內容是連接的,因此不會暴露很多選擇,一旦斷開連接或進行投影,您就可以自由支配所有內容。

static void Main(string[] args)
{
  using (var context = new TesterEntities())
  {
    var items = context.tePersons.ToList().Select(x => Math.Sin(x.PersonId));        
  }

    Console.ReadLine();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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