1

我理解为什么会出现以下错误,但是我不确定如何才能提供可以绕过它的解决方案。

{System.NotSupportedException: LINQ to Entities does not recognize the method 'Boolean IsStatus(CDAX.DataModel.ProcessStatusEnum)' method, and this method cannot be translated into a store expression.

我不想只返回 IEnumerable,因为我想将过滤器转换为底层 SQL 语句,这样我就不会查询这么多行等

    public override IQueryable<Session> GetQuery()
    {
        Func<Session, bool> activeSessions = (session) => !session.IsStatus(ProcessStatusEnum.Deleted);

        // these functions are causing issues.  I'm not sure how to change them to
        // work with IQueryable??   
        return base.GetQuery().Where(p => activeSessions(p) && _queryFilter.FilterOn(p.Customer));
    }

_queryFilter 类是一个接口,例如:

public interface IDataQueryFilter
{
    bool FilterOn(Customer obj);
}

客户只是我数据库中的一个实体对象,具有 Id、CustomerNumber 等属性

Session 是我数据库中的另一个 Entity 对象,IsStatus 方法是这样的:

    public bool IsStatus(ProcessStatusEnum status)
    {
        return SessionStatus == (byte)status;
    }

我使用的条件通常非常简单,因此我相信它们应该能够转换为 SQL。我想这只是因为它们在他们不能的函数内。我可以使用其他东西作为返回类型来让这些工作吗?

4

2 回答 2

0

您的IsStatus方法调用无法转换为 SQL。我建议您在不调用方法的情况下手动进行状态验证。

(session) => session.Status != ProcessStatusEnum.Deleted

另一种选择是将所有实体带入内存(通过执行ToList()),但这会很慢。

于 2013-02-21T21:28:23.820 回答
0

LINQ to Entities 正在尝试将您的 LINQ 查询转换为 SQL 语句。它现在无法直接在数据库上执行您的自定义 Func,因此它会引发此错误。

您可以简单地将您的IsStatus方法更改为session.Status == ProcessStatusEnum.Deleted,但您可能会收到有关第二个功能的错误。

“解决”这个问题的最简单方法是.ToList()在要在数据库上执行的部分和要在内存中执行的部分之间放置一个。显然,数据库上的内容越多越好。

对于您的过滤器,您可能会考虑将 FilterOn 更改为返回表达式树的方法:

public interface IDataQueryFilter
{
    Expression<Func<Customer, bool>> FilterOn();
}

然后例如,如果您希望伦敦的所有客户都通过 LondonCustomFilter 的实例:

public class LondonCustomFilter : IDataQueryFilter {
    Expression<Func<Customer, Bool>> FilterOn() {
        return (customer) => customer.City == "London";
    }
}
于 2013-02-21T21:28:52.967 回答