"LINQ to Entities does not recognize the method 'Boolean ***, and this method cannot be translated into a store expression."
"LINQ to Entities does not recognize the method 'Boolean ***, and this method cannot be translated into a store expression."
我正在编写一个 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 不执行错误?
提前致谢。
您不能将 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 到 "convert"。由于 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; }
}
我正在编写一个 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 不执行错误?
提前致谢。
您不能将 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 到 "convert"。由于 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; }
}