'Date' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported

后端 未结 8 495
粉色の甜心
粉色の甜心 2020-11-27 05:57

I am trying to execute the following code and am receiving an error

public List GetLoggingData(DateTime LogDate, string title)
{
     var context          


        
相关标签:
8条回答
  • 2020-11-27 06:08

    Not the greatest solution, but it works. For a variety of reasons, I have to use .net 3.5 at this point and modifying the database would be difficult. Anyways, here is a solution that works:

                var query = from t in context.Logs
                          where t.Title == title 
                          && t.Timestamp.Day == LogDate.Day
                          && t.Timestamp.Month == LogDate.Month
                          && t.Timestamp.Year == LogDate.Year
                          select t;
    

    Not the most elegant solution, but it is effective.

    0 讨论(0)
  • 2020-11-27 06:10

    EntityFunctions.TruncateTime(t.Timestamp) is obsolete from EF6.

    Use below

    DbFunctions.TruncateTime(t.Timestamp)

    0 讨论(0)
  • 2020-11-27 06:14

    You can use this hack:

    DateTime startDate = LogDate.Date;
    DateTime endDate = LogDate.Date.AddDays(1);
    
    var query = from t in context.Logs
                where t.Title == title 
                      && t.Timestamp >= startDate 
                      && t.Timestamp < endDate
                select t;
    
    0 讨论(0)
  • 2020-11-27 06:19

    If you are using EF 6.0+, you can use DbFunctions.TruncateTime(DateTime?) :

    var query =
        from t in context.Logs
        where t.Title == title 
        && DbFunctions.TruncateTime(t.Timestamp) == LogDate.Date
        select t;
    

    Note: For earlier version of EF where DbFunctions isn't available, EntityFunctions.TruncateTime(DateTime?) can be used instead.

    0 讨论(0)
  • 2020-11-27 06:23

    Always use EntityFunctions.TruncateTime() for both x.DateTimeStart and LogDate. such as :

    var query = from t in context.Logs
                  where t.Title == title 
                  && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate)
                  select t;
    
    0 讨论(0)
  • 2020-11-27 06:23

    Correct me if I'm wrong, but in mikemurf22's example, it would need to check each part of the date component, and potentially a lot more server processing?

    Anyway, I stumbled across this problem, and this is my solution.

    Assuming that you're going to be passing in the date component only, you can find the last minute of the day that you pass in, and use the where clause to define the range.

    public List<Log> GetLoggingData(DateTime LogDate, string title)
    {
        DateTime enddate = new DateTime(LogDate.Year, LogDate.Month, LogDate.Day, 23, 59, 59)
    
        var query = from t in context.Logs
                    where t.Timestamp >= date
                    where t.Timestamp <= enddate
                    select t;
    
        return query.ToList();
    }
    
    0 讨论(0)
提交回复
热议问题