2014-10-21 11 views
6

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.

+0

Haben Sie expression.ToString() versucht? Warum benutzt du Body? –

+0

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 –

+0

Der gescheiterte ist das Problem .. danke .. –

Antwort

5

Lokale Variable werden zur Laufzeit in einer vom Compiler generierten Klasse erfasst, dies erklärt den Payroll.Test.Administration.TestRepositories+<>c__DisplayClass13).searchKey-Teil. Um den Wert des generierten Feldes in Ihrem Ausdruck zu erhalten, müssen Sie dessen Wert beim Besuch des Ausdrucks explizit ersetzen:

+0

Dieser Moment, wenn Sie sagen "aaaaaaaaaaaaaaaaaaaaaahhhh" .. Danke :) –

+0

@VincentDagpin Passiert das Beste von uns;) – brz

Verwandte Themen