TruncateTime实体框架函数不支持异常

时间:2018-05-22 05:50:58

标签: c# entity-framework linq linq-to-entities

我在linq expresion中尝试使用TruncateTime()时遇到异常 而且我不确定为什么?

这是我的陈述

var yogaProfile = dbContext.YogaProfiles.Where(i => i.ApplicationUserId == userId).First();

var yogaEvents = yogaProfile.RegisteredEvents.Where(j => 
       (j.EventStatus == YogaSpaceEventStatus.Active || j.EventStatus == YogaSpaceEventStatus.Completed)
       && DbFunctions.TruncateTime(j.UTCEventDateTime) > DbFunctions.TruncateTime(yesterday)
       && DbFunctions.TruncateTime(j.UTCEventDateTime) <= DbFunctions.TruncateTime(todayPlus30)
       ).ToList();

这是例外

  

System.NotSupportedException:此函数只能从LINQ to Entities调用。

     

at System.Data.Entity.DbFunctions.TruncateTime(Nullable`1   DATEVALUE)

     

在   YogaBandy2017.Services.Services.YogaSpaceService&LT;&GT; c__DisplayClass9_1.b__1(YogaSpaceEvent   j)in   C:\ Users \用户chuckdawit \来源\工作区\ YogaBandy2017 \ YogaBandy2017 \ Yogabandy2017.Services \ SERVICES \ YogaSpaceService.cs:行   256

     

at System.Linq.Enumerable.WhereListIterator`1.MoveNext()

     

在System.Collections.Generic.List'1..ctor(IEnumerable`1   集合)

     

在System.Linq.Enumerable.ToList [TSource](IEnumerable`1 source)

     

在   YogaBandy2017.Services.Services.YogaSpaceService.GetUpcomingAttendEventCounts(字符串   userId)in   C:\ Users \用户chuckdawit \来源\工作区\ YogaBandy2017 \ YogaBandy2017 \ Yogabandy2017.Services \ SERVICES \ YogaSpaceService.cs:行   255

     

在   YogaBandy2017.Controllers.ScheduleController.GetEventCountsForAttendCalendar()   在   C:\ Users \用户chuckdawit \源\工作区\ YogaBandy2017 \ YogaBandy2017 \ YogaBandy2017 \控制器\ ScheduleController.cs:线   309

1 个答案:

答案 0 :(得分:1)

  

System.NotSupportedException:此函数只能从LINQ to Entities调用。

您有此异常,因为yogaProfile变量的结果不是Linq To Entities用于在服务器端执行查询的IQueryable。要使您的变量为IQueryable,您需要删除最后在查询中使用的扩展方法First(),并将其替换为Take(1)

所以而不是

var yogaProfile = dbContext.YogaProfiles.Where(i => i.ApplicationUserId == userId).First();

你应该有这个:

var yogaProfile = dbContext.YogaProfiles.Where(i => i.ApplicationUserId == userId).Take(1);

请注意,当您对变量执行Linq时,您将使用第一个语句处理Linq To Objects。删除First()扩展方法并将其替换为Take()扩展方法,即可执行Linq To Entites。