C# DbathmeticExpression参数必须具有数字公共类型
请帮忙 实体框架6和更早版本中不支持使用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
日期时间的算法。您必须使用*。因此,对于你陈述的第一部分,类似于:
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一起使用时,可能还有其他数据库提供程序)支持DateTimeAddXxx
函数(如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(....