2015-02-03 5 views
0

Я кодирования интернет приложения с MVC 5, и я получаю следующее сообщение об ошибке:«LINQ to Entities не распознает метод« Boolean *** », и этот метод не может быть переведен в выражение хранилища».

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; 
} 

Мой объект Account имеет следующие поля:

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

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

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

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

+0

'(учетная запись счета, внутр minimumDaysLeftInSubscriptionForEmail) ShouldDailyExpirationEmailBeSentForFreeTrialAccount' не могут быть преобразованы в Expression Linq, так как он имеет тип 'Func ', а не' Expression > '. Встройте код, и он должен работать. – Aron

ответ

3

Вы не можете реорганизовать запросы 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; } 
} 
+0

Спасибо, теперь у меня работает мой код. – user3736648