3

私はEntity Frameworkを使用しており、IQueryable<T>

IQueryable<Message> query = db.Messages;

query = query.OrderByDescending(m => m.Created);
query = query.Where(m => m.Deleted == false);

if (lastTime != null)
    query = query.Where(m => m.Created < lastTime);

var func = ExpressionHelper.GetPredicate(stream);

query = query.Where(func).AsQueryable; *** ISSUE HERE?? ***

query = query.Skip(skip)
          .Take(count)
          .Include(m => m.Tags)
          .Include(m => m.Properties);

var results = query.ToList();

問題は、タグとプロパティが最終リストに入力されていないことです。

Func<>私はそれが私が渡しているものと関係があると信じており、それAsQueryableが使用された後はデータベースを表していないIQueryableか、データベースに接続しなくなっていると信じています。

タグとプロパティを設定する方法はありますか?

Func<>をすることExpression<Func<>>が役立つかどうかはわかりません。もしそうなら、以下を変換する方法はありますかExpression<Func<>>

アップデート:

public static Func<Message, bool> GetPredicate(string expression)
{
    Func<Message, bool> result = null;

    try
    {
        ParameterExpression parameter = Expression.Parameter(typeof(Classes.Message), "Message");
        var lambda = DynamicExpression.ParseLambda(new[] { parameter }, null, expression);
        result = lambda.Compile() as Func<Message, bool>;
    }
    catch (Exception e)
    {
        Log.Fatal(e);
    }

    return result;
}
4

2 に答える 2

9

この時点で:

query.Where(func) // where func is Func<...>

LINQ-to-Objects に切り替えました。.Include(などに関して)その後に行うことはすべて無関係です-EFクエリを作成することはもうありません。その行にあったように、シーケンスの LINQ-to-Objects バージョンに薄いIQueryable<T>ラッパーがあります。

query = query.Where(func).AsQueryable(); // this is just a thing veneer over L2O

に切り替えるとExpression<Func<...>>役立つ可能性があります。

絶対に を生成できない場合は、 etcをこのポイントより上Expressionに移動できます。Include

于 2013-05-20T15:02:07.140 に答える
3

私は実際にこれを配線していないので、少しずれているかもしれませんが、Marc が言うように、AsQueryable で Linq to Objects に交換しました。

その呼び出しを削除してから、GetPredicate を下に切り替えると、機能するはずです。ラムダをコンパイルする必要がないことを除いて同じです。これは、クエリがエンティティ フレームワークに到達したときに発生します。

public static Expression<Func<Message, bool>> GetPredicate(string expression)
{
    Expression<Func<Message, bool>> result = null;

    try
    {
        ParameterExpression parameter = Expression.Parameter(typeof(Classes.Message), "Message");
        var lambda = DynamicExpression.ParseLambda(new[] { parameter }, null, expression);
        result = (Expression<Func<Message, bool>>)lambda;
    }
    catch (Exception e)
    {
        Log.Fatal(e);
    }

    return result;
}
于 2013-05-20T15:06:57.683 に答える