Ошибка статического метода Linq - PullRequest
0 голосов
/ 01 апреля 2011

Я создал следующую функцию, чтобы получить разницу дат:

    public static double MonthsDifference(DateTime dtStart, DateTime dtNow)
    {
        DateTime start = dtStart;
        DateTime end = dtNow;
        int compMonth = (end.Month + end.Year * 12) - (start.Month + start.Year * 12);
        double daysInEndMonth = (end - end.AddMonths(1)).Days;
        double months = compMonth + (start.Day - end.Day) / daysInEndMonth;
        return months;
    }

Я использую его в своем запросе LINQ

var query = from c in context.AccountOwners.Where( MonthsDifference(p.Account.StateChangeDate,DateTime.Now) < 4 )
                        select c;
            return query.Count();

но выдает ошибку:

LINQ to Entities не распознает метод метода Double MonthsDifference (System.DateTime, System.DateTime), и этот метод нельзя преобразовать в выражение хранилища.

Пожалуйста, предложите решение

Ответы [ 3 ]

1 голос
/ 01 апреля 2011

Если вы хотите сделать это в Linq, вам нужно встроить этот метод, чтобы Linq2Sql мог перевести его в sql.

Так что я думаю, вам понадобится что-то вроде:

var start = DateTime.Now;
var query = from c in context.AccountOwners
            let accountDate = c.Account.StateChangeDate
            let diff = (start.Month + start.Year * 12) - (accountDate.Month + accountDate.Year * 12) + ...
            where diff < 4
            select c;

return query.Count();

Связано с Разница в месяцах между датами

1 голос
/ 01 апреля 2011

В LINQ to Entities вы можете использовать Функции Entity :

using System.Data.Objects;

var query = from c in context.AccountOwners.Where(EntityFunctions.DiffMonths(
                           p.Account.StateChangeDate,DateTime.Now) < 4 )
            select c;
return query.Count();
1 голос
/ 01 апреля 2011

Функция MonthsDifference не может быть сопоставлена ​​с SQL, поэтому вы получаете эту ошибку. Вам нужно либо переписать выражение запроса без каких-либо вызовов ваших собственных методов , чтобы делать то, что вы хотите (что может быть невозможно - я не знаю точно, какие функции базы данных поддерживает LINQ to Sql), или получить набор результатов и выполнить фильтрацию локально.

Последний подход будет выглядеть так:

var count = context.AccountOwners.ToArray()
       .Count(o => MonthsDifference(p.Account.StateChangeDate,DateTime.Now) < 4);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...