Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DbathmeticExpression参数必须具有数字公共类型_C#_Entity Framework_Ado.net - Fatal编程技术网

C# DbathmeticExpression参数必须具有数字公共类型

C# DbathmeticExpression参数必须具有数字公共类型,c#,entity-framework,ado.net,C#,Entity Framework,Ado.net,请帮忙 实体框架6和更早版本中不支持使用日期时间的算法。您必须使用*。因此,对于你陈述的第一部分,类似于: DbArithmeticExpression arguments must have a numeric common type. var sleeps=context.sleeps(o=> DbFunctions.DiffHours(o.ClientDateTimeStamp,clientDateTime)(clientdtmins24time18&& clientDateTime.T

请帮忙

实体框架6和更早版本中不支持使用
日期时间的算法。您必须使用*。因此,对于你陈述的第一部分,类似于:

DbArithmeticExpression arguments must have a numeric common type.
var sleeps=context.sleeps(o=>
DbFunctions.DiffHours(o.ClientDateTimeStamp,clientDateTime)<24);
请注意,该方法接受
Nullable

Entity Framwork core(与Sql Server一起使用时,可能还有其他数据库提供程序)支持DateTime
AddXxx
函数(如
AddHours
)。它们在SQL中被转换为
DATEADD


*在Entity Framework版本6之前。

我知道这是一个老问题,但在您的具体案例中,您不能使用@GertArnold建议的
DBFunctions
,而只是反转操作,从Lambda中移出有问题的算术吗

毕竟,
clientDateTime
time24
是固定值,因此不需要在每次迭代中重新计算它们的差异

比如:

TimeSpan time24=新的时间跨度(24,0,0);
TimeSpan time18=新的TimeSpan(18,0,0);
var clientdtminus24=clientDateTime-time24;
//首先是今天的睡眠时间
List sleeps=context.sleeps.Where(
o=>(clientdtmins24time18&&
clientDateTime.TimeOfDay

如果您试图将存储的日期时间(按固定时间戳移动)与其他日期时间进行比较,则通常可以进行此重构。

另一方面,如果性能不是真正的目标,则可以尝试使用
AsEnumerable()
。 所以,这就像

TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);    

var clientdtminus24 = clientDateTime - time24;

// first get today's sleeping hours
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientdtminus24 < o.ClientDateTimeStamp) && 
          o.ClientDateTimeStamp.TimeOfDay > time18 && 
          clientDateTime.TimeOfDay < time18 && 
          o.UserID == userid).ToList();
List sleeps=context.sleeps.AsEnumerable()。其中(。。。。

添加一个可计算的()将SQL查询转换为实体,并允许在其上运行.Net函数。有关详细信息,请查看此处

clientDateTime-o.ClientDateTimeStamp的结果是什么?
?正常情况下,将引发in-EF异常。我遇到过这种情况,这很有帮助。但是,此解决方案的范围是y仅限于一种特定的问题。@Zimano它解决了OPs问题,而不需要他改变技术或求助于黑客。如果它可以像这样重构,那么就去做,如果不能,那么就按照公认的答案去做。
var sleeps = context.Sleeps(o =>
    DbFunctions.DiffHours(o.ClientDateTimeStamp, clientDateTime) < 24);
TimeSpan time24 = new TimeSpan(24, 0, 0);
TimeSpan time18 = new TimeSpan(18, 0, 0);    

var clientdtminus24 = clientDateTime - time24;

// first get today's sleeping hours
List<Model.Sleep> sleeps = context.Sleeps.Where(
    o => (clientdtminus24 < o.ClientDateTimeStamp) && 
          o.ClientDateTimeStamp.TimeOfDay > time18 && 
          clientDateTime.TimeOfDay < time18 && 
          o.UserID == userid).ToList();
List<Model.Sleep> sleeps = context.Sleeps.AsEnumerable().Where(....