разница в дате с linq - PullRequest
2 голосов
/ 01 марта 2010

С этим кодом:

 i.SpesaAlloggio = db.TDP_NotaSpeseSezB.Sum(p => p.Costo / (((DateTime)p.DayEnd)
                    .Subtract((DateTime)p.DayStart).Days + 1));

Я получаю эту ошибку:

LINQ to Entities does not recognize the method 
'System.TimeSpan Subtract(System.DateTime)' method, and this method cannot be 
translated into a store expression.

Как я могу это сделать?

Ответы [ 3 ]

1 голос
/ 01 марта 2010

Используйте вычисленное поле БД и отобразите это. Или используйте SqlFunctions с EF 4, как рекомендовано LukLed (+1).

0 голосов
/ 30 марта 2011

Я написал функцию для удаления времени: общедоступная статическая DateTime RemoveHours (дата DateTime) { int year = date.Year; int month = date.Month; int day = date.Day; вернуть новый DateTime (год, месяц, день); }

и изменилось условие фильтрации: var query = из trn в контексте. Идентичность транзакций где trn.ClientUserId == userId && trn.DateDeleted == null orderby trn.DateTimeCreated выберите новый { ClientServerTransactionID = trn.ClientServerTransactionID, DateTimeCreated = trn.DateTimeCreated, ServerTransDateTime = trn.ServerTransDateTime, Временная метка = trn.Timestamp, Remarc = trn.Remarc, ReservedSum = trn.ReservedSum, };

if (dateMin.HasValue && dateMin.Value > DateTime.MinValue)
{
    DateTime startDate = Converters.RemoveHours(dateMin.Value);
    query = from trn in query
                 where trn.DateTimeCreated >= startDate
                 select trn;
}
if (dateMax.HasValue && dateMax.Value > DateTime.MinValue)
{
    var endDate = Converters.RemoveHours(dateMax.Value.AddDays(1.0));
    query = from trn in query
                where trn.DateTimeCreated < endDate
                select trn;
}

dateMin и dateMax являются обнуляемыми типами и могут быть не установлены в моем случае.

0 голосов
/ 01 марта 2010

Попробуйте (это не очень эффективно, но будет работать):

i.SpesaAlloggio = db.TDP_NotaSpeseSezB.ToList()
             .Sum(p => p.Costo / (((DateTime)p.DayEnd)
             .Subtract((DateTime)p.DayStart).Days + 1));

РЕДАКТИРОВАТЬ: Это будет очень медленно для больших таблиц, потому что он передает весь сервер содержимого таблицы

Entity Framework пытается преобразовать ваше выражение в SQL, но не может обработать ((DateTime)p.DayEnd).Subtract((DateTime)p.DayStart). Вы должны сделать это проще. ToList() получает все строки, а затем выполняет вычисления на стороне приложения, а не в базе данных.

С EF4 вы можете использовать SqlFunctions DateDiff

С помощью EF1 вы можете создать вычисляемое поле или ракурс с этим полем и производить вычисления на основе этого поля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...