C# 如何使用Entity Framework 6将数学函数发送到Sql Server
我正在尝试使用EntityFramework6向SQLServer发送一个数学函数 我有一个简单的问题: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
使用(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()
是否循环通过所有