【问题标题】:LINQ to Entities does not recognize the method 'System.DateTime GetDate()' method, and this method cannot be translated into a store expressionLINQ to Entities 无法识别方法 'System.DateTime GetDate()' 方法,并且此方法无法转换为存储表达式
【发布时间】:2019-12-31 03:11:13
【问题描述】:

几个月前我刚刚开始学习 asp.net,但遇到了一些问题。我在浏览器上收到此错误LINQ 实体无法识别System.DateTime GetDate() 方法,而此代码在Linq 中完美运行。根据我在几个论坛上阅读的内容,当Linq to Entities 无法将代码转换为 SQL 查询时会发生此错误。但我仍然无法弄清楚我的方法有什么问题。
这是具有GetDate() 方法的类

public class Cycle
{
    private DateTime _Date;

    public DateTime Date 
    { 
        get => _Date;

        set => _Date = value;
    }

    public DateTime GetDate ()
    {
        return this._Date;
    }
}

这是调用该方法的查询

var RouteList = from site in Sites
                orderby site.Community.Name ascending
                where site.Season.SeasonYear == 2019 && site.Yard.YardID == 1 && site.SiteType.SiteTypeDescription.Equals("A")
                select new Status
                {
                    Pin = site.Pin,
                    Community = site.Community.Name,

                    Cycle1 = ((from sbm in SBMs where sbm.CrewSite.SiteID == site.SiteID select new Cycle { Date = sbm.CrewSite.Crew.TodayDate }).OrderBy(x => x.Date).FirstOrDefault()).Equals(null)
                         ? (DateTime?)null : ((from sbm in SBMs where sbm.CrewSite.SiteID == site.SiteID select new Cycle { Date = sbm.CrewSite.Crew.TodayDate }).OrderBy(x => x.Date).FirstOrDefault()).GetDate()

谁能帮我看看如何调整我的方法?

【问题讨论】:

  • GetDate() 无法转换为 SQL 语句。如果您只想要字段的日期部分,您可以使用 DbFunctions.TruncateTime()
  • 我试过了,但还是出现同样的错误
  • 试试Cycle1 = ((from sbm in SBMs where sbm.CrewSite.SiteID == site.SiteID select new Cycle { Date = DbFunctions.TruncateTime(sbm.CrewSite.Crew) }).OrderBy(x => x.Date).FirstOrDefault()).Equals(null) ? (DateTime?)null : ((from sbm in SBMs where sbm.CrewSite.SiteID == site.SiteID select new Cycle { Date = DbFunctions.TruncateTime(sbm.CrewSite.Crew)}).OrderBy(x => x.Date).FirstOrDefault()).Date怎么样
  • 你是个天才。有用。谢谢塞利姆
  • 不客气,我已经添加了答案。请check

标签: c# asp.net-mvc entity-framework linq


【解决方案1】:

您需要使用DbFunctions.TruncateTime() 来获取DateTime 的日期,并使用CycleDate 属性而不是自定义GetDate 方法:

var RouteList = from site in Sites
                    orderby site.Community.Name ascending
                    where site.Season.SeasonYear == 2019 && site.Yard.YardID == 1 && site.SiteType.SiteTypeDescription.Equals("A")
                    select new Status
                    {
                        Pin = site.Pin,
                        Community = site.Community.Name,

                         Cycle1 = ((from sbm in SBMs where sbm.CrewSite.SiteID == site.SiteID select new Cycle { Date = DbFunctions.TruncateTime(sbm.CrewSite.Crew) }).OrderBy(x => x.Date).FirstOrDefault()).Equals(null)
                             ? (DateTime?)null : ((from sbm in SBMs where sbm.CrewSite.SiteID == site.SiteID select new Cycle { Date = DbFunctions.TruncateTime(sbm.CrewSite.Crew)}).OrderBy(x => x.Date).FirstOrDefault()).Date

...

【讨论】:

  • 嗨,Selim,我仍然无法取出时间部分。我尝试了 DbFuntions.TruncateTime() 方法无济于事
  • 你添加System.Data.Entity命名空间了吗?
  • 是的,我做到了。但截断功能不会删除时间部分
  • 我也尝试将其放入 Cycle Class 但没有任何改变
  • 嗯我认为这将是另一个问题,因为它很难理解。它也取决于 EF 版本等。您可以查看stackoverflow.com/questions/19021606/…stackoverflow.com/questions/30588033/…
猜你喜欢
  • 1970-01-01
  • 2015-04-02
  • 1970-01-01
  • 2011-08-19
  • 2011-08-23
  • 2019-10-31
  • 2012-12-02
相关资源
最近更新 更多