2015-02-03 3 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; 
} 

내 계정 객체는 다음과 같은 필드가 있습니다

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

'ShouldDailyExpirationEmailBeSentForFreeTrialAccount (계정 계정 minimumDaysLeftInSubscriptionForEmail를 INT)이 타입이기 때문에'하는 Linq는 표현으로 변환 할 수없는'Func을 <계정, INT, 부울> '이 아니라 >'입니다. 코드를 인라인하면 제대로 작동합니다. – Aron

답변

3

LinqToXXX 쿼리를 메소드로 리팩터링 할 수 없습니다. 예를 들어

.

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


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

에 비해 매우 다른 일리노이

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

결과 후자는 "변환"을 EntityFramework에 FooIsBar을 통과하려고합니다. 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