C# 如何使用Entity Framework 6将数学函数发送到Sql Server

C# 如何使用Entity Framework 6将数学函数发送到Sql Server,c#,sql-server,entity-framework,linq,C#,Sql Server,Entity Framework,Linq,我正在尝试使用EntityFramework6向SQLServer发送一个数学函数 我有一个简单的问题: 使用(var db=databaseContext) { var query=db.Foo.Select(x=>Math.Sin(x.bar)); } 然而,这给了我一个例外 中发生“System.NotSupportedException”类型的异常 EntityFramework.dll,但未在用户代码中处理 附加信息:LINQ to实体无法识别该方法 “Double Sin(Doub

我正在尝试使用EntityFramework6向SQLServer发送一个数学函数

我有一个简单的问题:

使用(var db=databaseContext)
{
var query=db.Foo.Select(x=>Math.Sin(x.bar));
}
然而,这给了我一个例外

中发生“System.NotSupportedException”类型的异常 EntityFramework.dll,但未在用户代码中处理

附加信息:LINQ to实体无法识别该方法 “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));
}

我将首先从数据库加载数据,并在内存中进行此类计算

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来创建对象。默认的
Sin
不是EF中支持的函数

大量特定于MSSQL的函数在类
System.Data.Objects.SqlClient.SqlFunctions
中作为静态方法公开-但不是全部。
对于
Sin
您可以使用
SqlFunctions.Sin
而不需要使用linq来创建对象。默认的
Sin
在EF中不是受支持的函数

您的对象尚未实现,因此无法在其上执行复杂的函数。这与使用扩展方法和其他类似。只需在EntityFramework的许多功能中添加一个“ToList()”的神奇之处将使其得以实现,从而能够完成更多的功能。当对实体有疑问时,请使用“ToList()”。问题是,当您执行类似于以下操作时,对象未填满:

'context.(object).Select(x => (docomplexThing(x))'
实体有一些基本属性和操作,比如它可以执行的等式运算和lambda函数。在将对象转换为内存中更现实的对象或首先投影到某个对象之前,它无法执行重载方法。托利斯特做到了这一点。这不仅仅是数学运算,还有加密和定制的扩展方法。有时它们在某些情况下会起作用,但大多数情况下不起作用。我总是认为它就像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();
}

您的对象尚未实现,因此无法在其上执行复杂的功能。这与使用扩展方法和其他类似。只需在EntityFramework的许多功能中添加一个“ToList()”的神奇之处将使其得以实现,从而能够完成更多的功能。当对实体有疑问时,请使用“ToList()”。问题是,当您执行类似于以下操作时,对象未填满:

'context.(object).Select(x => (docomplexThing(x))'
实体有一些基本属性和操作,比如它可以执行的等式运算和lambda函数。在将对象转换为内存中更现实的对象或首先投影到某个对象之前,它无法执行重载方法。托利斯特做到了这一点。这不仅仅是数学运算,还有加密和定制的扩展方法。有时它们在某些情况下会起作用,但大多数情况下不起作用。我总是认为它就像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();
}

在代码端使用
Math.Sin
,我在代码端不能这样做。上面的例子是一个很有趣的例子,但实际上我是在一个有数百万行的非常大的数据库上做这件事的。最重要的是,我需要能够排序这个数学函数和页面我的结果。在代码端执行此操作不是一个选项。@因此,请将正确的Answare标记为“正确”,因为另一个Answare具有更多的向上投票权-具有相同问题的其他用户可以先看到正确的Answare。正如您所看到的,基于代码的Answare解决方案仍然会获得支持票,这会降低性能!那你愿意吗?!在代码端使用
Math.Sin
,我在代码端不能这样做。上面的例子是一个很有趣的例子,但实际上我是在一个有数百万行的非常大的数据库上做这件事的。最重要的是,我需要能够排序这个数学函数和页面我的结果。在代码端执行此操作不是一个选项。@因此,请将正确的Answare标记为“正确”,因为另一个Answare具有更多的向上投票权-具有相同问题的其他用户可以先看到正确的Answare。正如您所看到的,基于代码的Answare解决方案仍然会获得支持票,这会降低性能!那你愿意吗?!这种方法将循环两次结果,不会吗?或者
ToList()
是否循环遍历所有项目?检查EF CodeToList的实际功能。它是开源的:)我不能在代码端这样做。上面的例子是一个很有趣的例子,但实际上我是在一个有数百万行的非常大的数据库上做这件事的。最重要的是,我需要能够排序这个数学函数和页面我的结果。在代码端执行此操作不是一个选项。唯一的选项是将此业务逻辑放入数据库。创建一个存储过程,用于计算it@Fabio:首先检索所有行,然后在客户端进行处理的排序和分页本质上是不可伸缩的。这是您希望在数据库上执行的典型处理示例。如果必须等待30秒,没有人关心可读性。你的理论是正确的,只是不适用于这里。这种方法会循环两次结果。不会吗?或者
ToList()
是否循环通过所有