web-dev-qa-db-ja.com

「日付」はLINQ to Entitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされます

次のコードを実行しようとしていますが、エラーが発生します

public List<Log> GetLoggingData(DateTime LogDate, string title)
{
     var context = new LoggingEntities();
     var query = from t in context.Logs

           where t.Title == title 
           && t.Timestamp == LogDate

           select t;
     return query.ToList();
}

私が受け取っているエラーは、「指定された型メンバー 'Date'はLINQ to Entitiesではサポートされていません。初期化子、エンティティメンバー、およびエンティティナビゲーションプロパティのみがサポートされています。」です。私はすべての文字列を文字列にキャストするさまざまな試みを試みましたが、日付の部分を比較するだけですが、正しい組み合わせを得ることができないようです。どんな助けも大歓迎です。

48
mikemurf22

最大の解決策ではありませんが、機能します。さまざまな理由から、この時点で.net 3.5を使用する必要があり、データベースの変更は困難です。とにかく、ここに動作するソリューションがあります:

            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;

最もエレガントなソリューションではありませんが、効果的です。

24
mikemurf22

EF 6.0+を使用している場合、 DbFunctions.TruncateTime(DateTime?) を使用できます。

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

注:DbFunctionsが使用できないEFの以前のバージョンでは、代わりに EntityFunctions.TruncateTime(DateTime?) を使用できます。

88
Henrik Stenbæk
3
Rahul Nikate

X.DateTimeStartとLogDateの両方に必ずEntityFunctions.TruncateTime()を使用します。といった :

var query = from t in context.Logs
              where t.Title == title 
              && EntityFunctions.TruncateTime(t.Timestamp) == EntityFunctions.TruncateTime(LogDate)
              select t;
2
Babul Mirdha

私が間違っている場合は修正しますが、mikemurf22の例では、日付コンポーネントの各部分をチェックする必要があり、潜在的にはより多くのサーバー処理が必要ですか?

とにかく、私はこの問題に出くわし、これが私の解決策です。

日付コンポーネントのみを渡すと仮定すると、渡す日の最後の分を見つけて、where句を使用して範囲を定義できます。

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();
}
1
Mike

LongDateを.ToShortDateStringに変換すると、次のように使用できます。

EntityFunctions.TruncateTime(t.Timestamp) == LogDate

マイクがやったように

0
sansalk

これを試して:

var calDate = DateTime.Now.Date.AddDays(-90);

var result = return (from r in xyz where DbFunctions.TruncateTime(r.savedDate) >= DbFunctions.TruncateTime(calDate)
0
user3783446