Ich versuche, das Verhalten von Entity Framework bei der Erstellung der Abfrage von Ausdruck zu kopieren, und ich fand meinen Weg mit Expression wenn unter Verwendung AttributExpression Baum GetString Ergebnis
dies die Eigenschaft des Modells bekommen ist was ich habe bisher
internal class NVisitor : ExpressionVisitor
{
private readonly ParameterExpression _parameter;
private readonly Type _type;
public NVisitor(Type type)
{
_type = type;
_parameter = Expression.Parameter(type);
}
protected override Expression VisitParameter(ParameterExpression node)
{
return _parameter;
}
protected override Expression VisitMember(MemberExpression node)
{
if (node.Member.MemberType == MemberTypes.Property)
{
var memberName = node.Member.Name;
PropertyInfo otherMember = _type.GetProperty(memberName);
var ncols = node.Member.GetCustomAttributes(typeof(NColumn), true);
if (ncols.Any())
{
var ncol = (NColumn)ncols.First();
otherMember = _type.GetProperty(ncol.Name);
}
var inner = Visit(node.Expression);
return Expression.Property(inner, otherMember);
}
return base.VisitMember(node);
}
}
i nColumn ein Attribut, das den wirklichen Namen der Eigenschaft von Tabellenspalte zeigt an, so markieren i die Eigenschaft des Modells durch Attribut
public class BonusTypeX
{
[NColumn("BonusTypeName")]
public string Name { get; set; }
}
jetzt, wenn im um den Ausdruck zu erhalten versuchen,
[TestMethod]
public void ExpressionTesting2()
{
string searchKey = "Xmas";
Expression<Func<BonusTypeX, bool>> expression = x => x.Name.Contains(searchKey);
Type t = typeof(tbl_BonusType);
var body = new NVisitor(t).Visit(expression.Body);
string a = string.Join(".", body.ToString().Split('.').Skip(1));
Assert.AreEqual("BonusTypeName.Contains(\"Xmas\")", a);
}
Ich habe dieses
BonusTypeName.Contains (Wert (Payroll.Test.Administration.TestRepositories + <> c__DisplayClass13). searchKey)
was ich erwarte, ist
BonusTypeName.Contains ("Weihnachten")
ist es eine Methode, die die Expression Zeichenfolge wird? Ich bin mit
string a = string.Join(".", body.ToString().Split('.').Skip(1));
, die ich denke, es könnte falsch sein .. :)
jede mögliche Hilfe würde geschätzt.
Haben Sie expression.ToString() versucht? Warum benutzt du Body? –
immer noch kein Glück .. nebenbei, ich habe eine Pastebin für Sie, um zu prüfen, ob Sie etwas Zeit haben .. http://pastebin.com/1qxj1irw –
Der gescheiterte ist das Problem .. danke .. –