2

次のように機能するビジネス層呼び出しがあります。

CustomerRepository.Get(c => SqlFunctions.PatIndex("%" + arg + "%", c.FirstName));

式を使用してこれを構築しようとしています:

    public virtual IEnumerable<TEntity> Like(string LikeString, string Target)
    {
        MethodInfo method = typeof(SqlFunctions).GetMethod("PatIndex");
        var arg1 = Expression.Constant(LikeString);
        var item = Expression.Parameter(typeof(TEntity), "item");
        var prop = Expression.Property(item, Target);

        MethodCallExpression resultExp =
            Expression.Call(method, arg1, prop);

        var value = Expression.Constant(0, typeof(int?));

        var greaterThan = Expression.GreaterThan(resultExp, value);

        var lambda = Expression.Lambda<Func<TEntity, bool>>(greaterThan, item);

        var result = Repo<TEntity>.Get().AsQueryable().Where(lambda);

        return result;
    }

上記のメソッドを呼び出すと、次の例外が発生します。

This function can only be invoked from LINQ to Entities.

これを乗り越える方法、または私がやりたいことをする方法についてのアイデアはありますか? Expression コードは問題ないように見えますか?

4

1 に答える 1

1

問題を理解した

から:

var result = Repo<TEntity>.Get().AsQueryable().Where(lambda);

に:

var result = Repo<TEntity>.Get(lambda);
于 2013-06-03T15:43:44.883 に答える