【问题标题】:"LINQ to Entities does not recognize the method 'Boolean ***, and this method cannot be translated into a store expression."“LINQ to Entities 无法识别方法 'Boolean ***,并且此方法无法转换为存储表达式。”
【发布时间】:2015-04-02 08:27:47
【问题描述】:

我正在编写 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 不会执行错误?

提前致谢。

【问题讨论】:

  • ShouldDailyExpirationEmailBeSentForFreeTrialAccount(Account account, int minimumDaysLeftInSubscriptionForEmail) 无法转换为 Linq 表达式,因为它的类型为 Func&lt;Account, int, bool&gt; 而不是 Expression&lt;Func&lt;Account, int, bool&gt;&gt;。内联代码,它应该可以工作。

标签: linq asp.net-mvc-5 linq-to-entities linq-expressions


【解决方案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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    相关资源
    最近更新 更多