【问题标题】:How to use Date function in LINQ to entities?如何在 LINQ to 实体中使用日期函数?
【发布时间】:2013-09-17 19:09:33
【问题描述】:

我的方法应该返回一个用户注释列表,所以我这样做了:

  var saturday = DayOfWeek.Saturday;
  var query = from note in userNotes
  where note.NoteDate > lastMonth && note.NoteDate.DayOfWeek != saturday
        select note;

但我得到这个错误:

LINQ to Entities 不支持指定的类型成员“日期”。只有初始化器、实体成员和实体导航属性。

关于如何使用 linq 比较星期几的任何想法?

【问题讨论】:

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


    【解决方案1】:

    使用SqlFunctions.DatePart 静态方法。会转化为DATEPARTTSQL函数调用。

    var saturday = (int)DayOfWeek.Saturday;
    var query = from note in userNotes
                where note.NoteDate > lastMonth && SqlFunctions.DatePart("dw", note.NoteDate) != saturday
                select note;
    

    【讨论】:

    • 对于EF,你需要EntityFunctions
    • @SLaks MSDN 对SqlFunctions 类的描述:提供在 LINQ to Entities 查询中调用数据库中函数的公共语言运行时 (CLR) 方法。我>
    • 一个小警告,DatePart 的结果取决于 SQL Server 中的“第一个工作日设置”,另一种方法在这里:c-sharp-snippets.blogspot.de/2011/12/…
    • @Slauma +1 介绍链接中有趣的解决方案
    • @Alireza:是的,这是一个很好的解决方案,不仅因为它避免了对“第一个工作日设置”的依赖,还因为它只使用了EntityFunctions,它独立于提供程序/数据库,而@987654331 @ 仅适用于 SQLClient/SQL Server(除了可能必须选择另一个(可能更晚)的参考年份而不是 1753 年以同样好地支持其他数据库)。
    【解决方案2】:

    由于我使用的是 Oracle,我无法使用 SqlFunctions 类。最终我找到了解决这个问题的简单方法:

    通常当您尝试使用 LINQ 不使用的属性时 本机支持,您需要创建一个具体的实现 应用 LINQ 约束之前的集合。

    您可以在之前使用 ToList() 或 AsEnumerable() 方法执行此操作 您的 Where 子句如下所示:

     //Using the ToList() method
    IEnumerable<CalendarDate> LessonDates = db.CalendarDates.ToList().Where(cd => cd.Date.DayOfWeek == DayOfWeek.Friday);
    
    //Using the AsEnumerable() method
    IEnumerable<CalendarDate> LessonDates = db.CalendarDates.AsEnumerable().Where(cd => cd.Date.DayOfWeek == DayOfWeek.Friday);
    

    来源:link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2010-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多