我在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
答案 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。