eine Implementierung von IQueryable<T>
im Rahmen Es gibt - MSDN: EnumerableQuery<T>
Wenn Sie dies auf dem Client verwenden können, um die Abfrage zu erstellen, können Sie den gesamten Ausdruck Baum aus der IQueryable<T>.Expression
Eigenschaft erhalten.
Sie müssen dies testen, um zu sehen, ob es mit diesem Expression Tree Serializer funktioniert.
Sie können dann den Ausdruck serialisieren, über die Leitung spritzen und dann deserialisieren.
Dann ist das Problem, dass der Ausdruck Baum auf einem EnumerableQuery<T>
basiert.
So müssen Sie das von Ihrem mit Ihrer IQueryable<T>
Quelle ersetzen echten DbContext
Dies wird ein Bit chaotisch, aber ich habe eine Implementierung geschrieben ein ExpressionVisitor:
IQueryable FixupExpressionTree(ObjectContext ctx, Type entityType, Expression expression)
{
var tObjectContext = ctx.GetType();
var mCreateObjectSetOpen = tObjectContext.GetMethod("CreateObjectSet", new Type[ 0 ]);
var mCreateObjectSetClosed = mCreateObjectSetOpen.MakeGenericMethod(entityType);
var objectQuery = (ObjectQuery) mCreateObjectSetClosed.Invoke(ctx, null);
var eFixed = new Visitor(objectQuery, entityType).Visit(expression);
var qFixed = ((IQueryable) objectQuery).Provider.CreateQuery(eFixed);
return qFixed;
}
verwenden und die ExpressionVisitor
selbst:
public class Visitor : ExpressionVisitor
{
ObjectQuery _Source = null;
Type _EntityType = null;
public Visitor(ObjectQuery source, Type entityType) { _Source = source; _EntityType = entityType; }
protected override Expression VisitConstant(ConstantExpression node)
{
if (!node.Type.Name.Contains("EnumerableQuery")) return base.VisitConstant(node);
var eConstantInstance = Expression.Constant(_Source);
var eConstantArgument = Expression.Constant(MergeOption.AppendOnly);
var tObjectQueryOpen = typeof(ObjectQuery<>);
var tObjectQueryClosed = tObjectQueryOpen.MakeGenericType(_EntityType);
var eMergeAsMethod = tObjectQueryClosed.GetMethod("MergeAs", BindingFlags.Instance | BindingFlags.NonPublic);
return Expression.Call(eConstantInstance, eMergeAsMethod, eConstantArgument);
}
}
Calli ng ist dies einfach:
Type entityType = ...
Expression expression = ...
DbContext db = ...
ObjectContext ctx = ((IObjectContextAdapter) db).ObjectContext;
IQueryable query = FixupExpressionTree(ctx, entityType, expression);
ich dies weiß, ist keine Antwort auf Ihre Frage, aber aus Erfahrung, ich würde das nicht tun und stattdessen spezielle Business-Service schreiben. Sie erhöhen die Komplexität und ermöglichen Ihren Clients, das System mit fehlerhaften Abfragen zu überlasten. –