C# 方法名称(int,DateTime)不支持转换为SQL

C# 方法名称(int,DateTime)不支持转换为SQL,c#,linq,C#,Linq,我有一个函数,Name(int,DateTime),我想在linq2sql查询中使用它 这是一个简单的函数,用于计算传入的DateTime对象和DateTime之间的差异。现在使用TimeSpan。然后我用.TotalHours和传入的int做一些基本的数学运算。最复杂的函数是math.Pow(double,double) 我得到这个错误: Method 'Double Name(Int32, System.DateTime)' has no supported translation to S

我有一个函数,
Name(int,DateTime)
,我想在linq2sql查询中使用它

这是一个简单的函数,用于计算传入的DateTime对象和DateTime之间的差异。现在使用
TimeSpan
。然后我用.TotalHours和传入的int做一些基本的数学运算。最复杂的函数是math.Pow(double,double)

我得到这个错误:

Method 'Double Name(Int32, System.DateTime)' has no supported translation to SQL. 
运行这样的查询时:

var q = from k in db.Stuff
        select new {Name=Name(k.num, k.Timestamp)};
我知道函数无法转换为SQL,因为它目前是编写的。有没有一种方法可以将我拥有的东西转换成SQL可用的东西


我应该注意,ToList()或ToArray()方法不可用,因为datatable很大。

由于您的转换仅在投影时使用,我建议您只需在.NET中而不是在SQL中进行转换:

var q = db.Stuff.Select(k => new { k.num, k.Timestamp })
                .AsEnumerable() // Do further processing in .NET
                .Select(k => Name(k.num, k.Timestamp));
请注意,我也从匿名类型中取出了结果,因此
q
的类型将只是一个
IEnumerable


如果您确实需要在数据库中完成处理,我建议您自己用SQL编写一个用户定义的函数,并告诉LINQ to SQL这一点(或者将其作为您选择的视图的一部分)。

由于您的转换仅在投影时使用,我建议您只需在.NET中而不是在SQL中进行转换:

var q = db.Stuff.Select(k => new { k.num, k.Timestamp })
                .AsEnumerable() // Do further processing in .NET
                .Select(k => Name(k.num, k.Timestamp));
请注意,我也从匿名类型中取出了结果,因此
q
的类型将只是一个
IEnumerable


如果您确实需要在数据库中完成处理,我建议您自己用SQL编写一个用户定义的函数,并告诉LINQ to SQL(或者将其作为您选择的视图的一部分)。

LINQ to SQL不能转换任意代码方法,因为它们是IL(它需要“表达式树”),这是lambdas和LINQ查询语法生成的)。如果在.NET代码中只需要此逻辑,请在调用之前切换到LINQ to对象,即

var qry = some complex LINQ query

var data = from row in qry.AsEnumerable()
            select new {
               row.Id,
               Name = YourType.Name(row.Foo, row.Bar)
            };
AsEnumerable()将LINQ组合一分为二,允许托管代码正常运行

如果需要在数据库中执行类似的操作,那么将代码作为UDF写入TSQL,然后将UDF拖到设计器中,将其映射到LINQ to SQL。然后,您可以将其作为数据上下文上的新方法进行访问,即

 select db.Name(row.Foo, row.Bar)

LINQ到SQL不能转换任意代码方法,因为它们是IL(它需要“表达式树”,这是lambdas和LINQ查询语法生成的)。如果在.NET代码中只需要此逻辑,请在调用之前切换到LINQ to对象,即

var qry = some complex LINQ query

var data = from row in qry.AsEnumerable()
            select new {
               row.Id,
               Name = YourType.Name(row.Foo, row.Bar)
            };
AsEnumerable()将LINQ组合一分为二,允许托管代码正常运行

如果需要在数据库中执行类似的操作,那么将代码作为UDF写入TSQL,然后将UDF拖到设计器中,将其映射到LINQ to SQL。然后,您可以将其作为数据上下文上的新方法进行访问,即

 select db.Name(row.Foo, row.Bar)

答案不是这样的,但是如果你在数据库中使用日期时间值,你真的应该使用UTC时间来避免夏令时变化带来的任何问题,因为夏令时的变化会使时间倒退或向前跳跃。如果有必要的话,我在DB中使用DateTime2(7)。如何在数据库中使用UTC时间?有关SQLServer2008中的DateTimeOffset的有趣阅读:只要在代码中使用DateTime.UtcNow即可,无论您是否需要存储该值,或者你需要做一个比较。这不是答案,但是如果你在数据库中使用日期时间值,你真的应该使用UTC时间来避免夏令时变化带来的任何问题,因为夏令时的变化会使时间倒退或向前跳跃。如果有关系的话,我在DB中使用DateTime2(7)。如何在我的数据库中使用UTC时间?有趣的阅读SQLServer2008中的DateTimeOffset:只要在代码中使用DateTime.UtcNow,无论是需要存储的值还是需要进行的比较。感谢您的回复。这是我打算做的,但我关心的是AsEnumerable的性能。什么时候不应该使用AsEnumerable()。@Shawn:传输的数据量不会有太大的变化——你仍然要获取每个记录的“某些信息”,所以在哪里做并不重要。如果您一直在执行Sum或Where子句之类的操作,那么显然应该在数据库中执行,因为它可以比从客户端获取所有数据更有效。。。但在这种情况下,我认为这不太可能有多大的区别。谢谢你的信息!我实现了这个解决方案。非常简单,但我了解到AsEnumerable的性能并不差,因为出于某种原因,我以前曾怀疑过这一点。@Jon AsEnumerable在l2s中使用时,会导致这些值与数据上下文一起加载,而数据上下文会使任何附加调用抛出异常,即已添加具有相同键的项。我们如何解决这个问题仍然使用数字感谢的回应。这是我打算做的,但我关心的是AsEnumerable的性能。什么时候不应该使用AsEnumerable()。@Shawn:传输的数据量不会有太大的变化——你仍然要获取每个记录的“某些信息”,所以在哪里做并不重要。如果您一直在执行Sum或Where子句之类的操作,那么显然应该在数据库中执行,因为它可以比从客户端获取所有数据更有效。。。但在这种情况下,我认为这不太可能有多大的区别。谢谢你的信息!我实现了这个解决方案。非常简单,但我了解到AsEnumerable的性能并不差,因为出于某种原因,我以前曾怀疑过这一点。@Jon AsEnumerable在l2s中使用时,会导致这些值与数据上下文一起加载,而数据上下文会使任何附加调用抛出异常,即已添加具有相同键的项。我们如何解决这个问题,仍然使用