Как исправить «LINQ to Entities не распознает метод« System.DateTime GetValueOrDefault () »»? - PullRequest
1 голос
/ 27 марта 2020

У меня есть этот код. По сути, мне нужно изменить дату и сообщить пользователю, что сегодня магазин будет открыт с 10 до 22 часов. Так что время здесь установлено.

от: -

today_date = "2020-03-23T00: 00: 00"

start_hour_time = "1900-01-01T10: 00 : 00 "

end_hour_time =" 1900-01-01T22: 00: 00 "

изменить на: -

start_newdatetime =" 2020-03 -23T10: 00: 00 "

end_newdatetime =" 2020-03-23T22: 00: 00 "

DateTime todaysdate = DateTime.Now.Date;       

var find_date = bdb.tbl_store
        .Join(bdb.tbl_hour, a => a.start_hour_id, b => b.hour_id, (a, b) => new { a, b })
        .Join(bdb.tbl_hour, a => a.a.end_hour_id, b => b.hour_id, (a, b) => new { a, b })
        .Where(x => x.a.a.store_id == store_id )
        .Select(x => new {

        x.a.a.store_id,
        start_hour_time = x.a.b.hour_time,
        end_hour_time = x.b.hour_time,
        start_newdatetime = todaysdate.Date+ x.a.b.hour_time.GetValueOrDefault().TimeOfDay,
        end_newdatetime = todaysdate.Date + x.b.hour_time.GetValueOrDefault().TimeOfDay

    }) .ToList();

проблема сейчас, это ошибка. Потому что я хочу, чтобы он был на том же вар.

«Сообщение»: «Произошла ошибка.», «ExceptionMessage»: «LINQ to Entities не распознает метод« System.DateTime
GetValueOrDefault () »и этот метод не может быть преобразовано в выражение магазина. "," ExceptionType ":" System.NotSupportedException ",

, но это будет хорошо, если я создам другую переменную для возврата нового значения.

1 Ответ

1 голос
/ 27 марта 2020

Ваше выражение, похоже, не работает, так как члены GetValueOrDefault и TimeOfDay недоступны для трансляции запросов EF DB, поэтому вам как-то придется как-то обойти эту проблему. На данный момент я не могу проверить, но я думаю, что возможно следующее

var find_date = bdb.tbl_store
        .Join(bdb.tbl_hour, a => a.start_hour_id, b => b.hour_id, (a, b) => new { a, b })
        .Join(bdb.tbl_hour, a => a.a.end_hour_id, b => b.hour_id, (a, b) => new { a, b })
        .Where(x => x.a.a.store_id == store_id )
        .ToList()
        .Select(x => new {
            x.a.a.store_id,
            start_hour_time = x.a.b.hour_time,
            end_hour_time = x.b.hour_time,
            start_newdatetime = todaysdate.Date + x.a.b.hour_time.GetValueOrDefault().TimeOfDay,
            end_newdatetime = todaysdate.Date + x.b.hour_time.GetValueOrDefault().TimeOfDay
    }).ToList();

Таким образом, ваш запрос выполняется при вызове ToList и всего остального (выражение Lambda передается Select) выполняется на клиенте как простое C#, поэтому у Entity нет никаких оснований жаловаться. Правда, я точно не знаю, полностью ли разрешены эти объекты при вызове ToList. Если это не так, вы можете сделать что-то вроде этого

var find_date = bdb.tbl_store
        .Join(bdb.tbl_hour, a => a.start_hour_id, b => b.hour_id, (a, b) => new { a, b })
        .Join(bdb.tbl_hour, a => a.a.end_hour_id, b => b.hour_id, (a, b) => new { a, b })
        .Where(x => x.a.a.store_id == store_id)
        .Select(x => new {
            x.a.a.store_id,
            start_hour_time = x.a.b.hour_time,
            end_hour_time = x.b.hour_time 
        })
        .ToList()
        .Select(x => new {
            store_id,
            start_hour_time,
            end_hour_time,
            start_newdatetime = todaysdate.Date + start_hour_time.GetValueOrDefault().TimeOfDay,
            end_newdatetime = todaysdate.Date + end_hour_time.GetValueOrDefault().TimeOfDay
        }).ToList();
...