Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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# 如何正确转换IQueryable日期时间?_C# - Fatal编程技术网

C# 如何正确转换IQueryable日期时间?

C# 如何正确转换IQueryable日期时间?,c#,C#,我是C语言的新手,我花了几个小时试图把它做好 我试图将数据库中的值复制到局部变量,以便获得两个日期之间的时间跨度(以分钟为单位)。最后一部分我想我已经解决了,但是在timespan线上我得到了一个错误: DbComparisonExpression需要具有可比较类型的参数 就我目前所了解的情况而言,end_time和start_time变量是IQueryable格式的。如何将它们转换为普通的日期时间变量 var end_time = from r in db.Reservations

我是C语言的新手,我花了几个小时试图把它做好

我试图将数据库中的值复制到局部变量,以便获得两个日期之间的时间跨度(以分钟为单位)。最后一部分我想我已经解决了,但是在timespan线上我得到了一个错误:

DbComparisonExpression需要具有可比较类型的参数

就我目前所了解的情况而言,end_time和start_time变量是IQueryable格式的。如何将它们转换为普通的日期时间变量

var end_time = from r in db.Reservations
               where r.CustomUserID.Equals(user.Id)
               select r.EndDate;

var start_time = from r in db.Reservations
                 where r.CustomUserID.Equals(user.Id)
                 select r.BeginDate;

TimeSpan timespan = end_time.First() - start_time.First();

提前感谢您的帮助:干杯

我愿意冒险回答这个问题,因为我以前在自己的代码中看到过类似的内容

因为LINQ基于不同执行的概念,所以在调用end_time.First-start_time.First之前,您只能从特定查询中获得表达式。这是当您的LINQ被实体框架转换为SQL并进行DB调用时

从错误质量来看,我认为是r.CustomUserID.Equalsuser.Id构造导致了错误。尝试将其更改为r.CustomUserID==user.Id。我打赌这会解决问题

这里的另一点是,如果您希望从where condition CustomUserID=Id得到相同的记录,为什么不选择tuple或包含这两个日期的匿名类型呢

(r.BeginDate, r.EndDate)
new {a = r.BeginDate, b = r.EndDate}

这将节省到数据库的行程

您必须使用其中一个。因此,对于您的声明,类似于:

var uid = user.Id;
var time_diff = (from r in db.Reservations
                       where r.CustomUserID.Equals(uid)
                       select SqlFunctions.DateDiff("minute", r.BeginDate, r.EndDate)).FirstOrDefault();

这是实体框架吗?CustomUserID和user.ID是否为Int32?请查看关于发布代码的指导。请张贴以避免var的使用,使用VS中的显式快速重构来修复它,考虑将每个值都像EndoTime.首先在单独的变量中,并确保验证哪一行实际产生错误,因为您所声称的错误不太可能发生在您所说的行中:您使用EF,是db上下文,并且保留了一个dBSET?问:你看过MSVS调试器中的结束时间和开始时间了吗?他们的价值观是什么?问:查询实际上返回了什么吗?还是这就是问题所在?请:更新你的帖子并回答这些问题。请用实际的类型替换var。我想,所有人都不知道这个错误与where r.CustomUserID.Equalsuser.Id有关。这是不同的执行,当调用First时,equals不能很好地由EF转换为SQL。我以前吃过这个。参见topNo男士的第2条评论。问题仍然在这里r.CustomUserID.Equalsuidwhat是CustomUserID和user.Id的类型?我猜EF无法比较导致问题的类型,也许您可以将两个属性都设置为相同的类型,然后它就会起作用。请注意,从同一记录中同时选择“开始”和“结束”实际上是一个正确性问题,因为数据库不需要为每个查询返回相同顺序的项,除非您按某个唯一键排序。@AlexeiLevenkov I指出,如果如果条件保证返回相同的记录,即id是唯一的,则应同时选择两个字段。如果你问我,从两个不同的字段中选择random first和另一个random first并计算差异有什么意义-胡说八道。我打赌OP where子句缺少另一个标识符。所以,我的建议主要是假设性的。当然只是文章中的评论看起来像是一个性能建议,如果你期望相同的记录,那么它实际上是正确性所必需的。