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.

フィルターを基礎となる SQL ステートメントに変換して、非常に多くの行などを照会しないようにするため、単に IEnumerable を返したくありません。

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

Customer は、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

もう 1 つのオプションは、すべてのエンティティを ( を実行して) メモリに取り込むことToList()ですが、これは遅くなります。

于 2013-02-21T21:28:23.820 に答える
0

LINQ to Entities は、LINQ クエリを SQL ステートメントに変換しようとしています。データベースでカスタム Func を直接実行する方法がないため、このエラーがスローされます。

IsStatus単純にメソッドを に変更することもできますsession.Status == ProcessStatusEnum.Deletedが、2 番目の関数に関するエラーが発生する可能性があります。

これを「修正」する最も簡単な方法は.ToList()、データベースで実行する部分とメモリで実行する部分の間に a を配置することです。ただし、データベースに保存されるデータが多いほど、明らかに優れています。

フィルタについては、FilterOn を Expression ツリーを返すメソッドに変更することを検討してください。

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 に答える