"LINQ to Entities не распознает метод Boolean ***, и этот метод нельзя преобразовать в выражение хранилища".

Я пишу интернет-приложение MVC 5 и получаю следующую ошибку:

base = {"LINQ to Entities does not recognize the method 'Boolean IsAccountSetupForSendingFreeTrialSubscriptionExpirationEmail(CanFindLocation.Models.Account)' method, and this method cannot be translated into a store expression."}

Вот мои методы:

public IEnumerable<Account> GetFreeTrialAccountsForSendDailyExpirationEmails(int minimumDaysLeftInSubscriptionForEmail)
{
    IEnumerable<Account> freeTrialAccounts = genericMultipleRepository.accounts.Value.SearchFor(a => IsAccountSetupForSendingFreeTrialSubscriptionExpirationEmail(a) && ShouldDailyExpirationEmailBeSentForFreeTrialAccount(a, minimumDaysLeftInSubscriptionForEmail));
    return freeTrialAccounts;
}

public bool IsAccountSetupForSendingFreeTrialSubscriptionExpirationEmail(Account account)
{
    if (account.isFreeTrial && account.sendSubscriptionExpirationEmail)
    {
        return true;
    }
    else
    {
        return false;
    }
}

public bool ShouldDailyExpirationEmailBeSentForFreeTrialAccount(Account account, int minimumDaysLeftInSubscriptionForEmail)
{
    if (IsExpiresDateTimeLessThanMinimumDaysLeftInFreeTrialSubscription(account, minimumDaysLeftInSubscriptionForEmail) && !HasSubscriptionEmailBeenSentForCurrentFreeTrialEndDateTime(account))
    {
        return true;
    }
    else
    {
        return false;
    }
}

public bool IsExpiresDateTimeLessThanMinimumDaysLeftInFreeTrialSubscription(Account account, int minimumDaysLeftInSubscriptionForEmail)
{
    TimeSpan expires = account.freeTrialEndDate - DateTime.UtcNow;
    return expires.Days < minimumDaysLeftInSubscriptionForEmail;
}

public bool HasSubscriptionEmailBeenSentForCurrentFreeTrialEndDateTime(Account account)
{
    return account.subscriptionEndDateForExpirationEmail == account.freeTrialEndDate;
}

Объект Моя учетная запись имеет следующие поля:

public bool isFreeTrial { get; set; }
public bool sendSubscriptionExpirationEmail { get; set; }
public DateTime subscriptionEndDateForExpirationEmail { get; set; }
public DateTime freeTrialEndDate { get; set; }

Я провел некоторое исследование и понял, что написанный мной код не может быть преобразован в выражение LINQ.

Что мне нужно сделать, чтобы преобразовать мой код в правильную форму, чтобы LINQ to Entities не выполнял ошибку?

Заранее спасибо.

1 ответ

Решение

Вы не можете реорганизовать запросы LinqToXXX в методы.

Например.

IQueryable<Foo> foos = ...;
IQueryable<Foo> results = from f in foos
                          where f.IsBar
                          select f;

Результаты значительно отличаются IL, чем

IQueryable<Foo> foos = ...;
IQueryable<Foo> results = from f in foos
                          where FooIsBar(f)
                          select f;


public bool FooIsBar(Foo foo)
{
    return foo.IsBar;
}

Последний попытается выдать себя FooIsBar EntityFramework для "конвертации". Поскольку EntityFramework не имеет доступа к исходному коду на данный момент, он не может выполнять преобразование скомпилированного кода IL в SQL.

Альтернатива заключается в следующем...

IQueryable<Foo> foos = ...;
IQueryable<Foo> results = from f in foos.Where(FooIsBar)
                          select f;


public Expression<Func<Foo, bool>> FooIsBar
{
    get { return foo => foo.IsBar; }
}
Другие вопросы по тегам