2013-06-27 29 views
2

進出口使用的DynamicQueryable.Select()//動態選擇庫動態選擇的EntityFramework和System.Linq.Dynamic

我到目前爲止發現的唯一的實況是System.Linq.Dynamic docu

我有這個疑問匿名回報類型的工作。

var result = Context.Set<TPocoText>().Where((Expression<Func<TPocoText, bool>>) whereLambda) 
        .OrderByDescending(t => t.RowVersion).Skip(skip).Take(take) 
        .Select("new (m1,m2,Nav1) "); 

,這就像select(t=> new {t.m1,t.m2,t.Nav1})預期

我的問題 它如何能做到的選擇相當於(T =>新{T,t.Nav1})

我試着。選擇(「new(it,Nav1)」) 和.Select(「new(this,Nav1)」)

結果是未找到分析錯誤成員。 有人知道這個動態的字符串解析API嗎?

或等效表達式構建語法也是一種選擇。

注意:Nav屬性ForSourceRecord只在運行時已知,否則我只會使用正常的lambda表達式。

回答

2

這不能用anon類型來完成。編譯器不具備工作所需的信息,特別是使用自由文本/字符串方法。

嘗試......

var param = System.Linq.Expressions.Expression.Parameter(typeof(TPocoText)); 
var init = System.Linq.Expressions.Expression.MemberInit(
    System.Linq.Expressions.Expression.New(typeof(Foo)), 
    new []{ 
     System.Linq.Expressions.Expression.Bind(GetMemberInfo((Foo f) => f.Nav), System.Linq.Expressions.Expression.PropertyOrField(param, "NameOfPropertyToBindToNav")), 
     System.Linq.Expressions.Expression.Bind(GetMemberInfo((Foo f) => f.M1), System.Linq.Expressions.Expression.PropertyOrField(param, "M1")), 
    } 
); 
var result = Context.Set<TPocoText>().Where((Expression<Func<TPocoText, bool>>) whereLambda) 
       .OrderByDescending(t => t.RowVersion).Skip(skip).Take(take) 
       .Select(System.Linq.Expressions.Expression.Lambda<Func<TPocoText, Foo>>(init, param)); 



public class Foo 
{ 
    public string Nav {get;set;} 
    public string M1 {get;set;} 
} 
public static MemberInfo GetMemberInfo<T, U>(Expression<Func<T, U>> expression) 
{ 
    var member = expression.Body as MemberExpression; 
    if (member != null) 
     return member.Member; 

    throw new ArgumentException("Expression is not a member access", "expression"); 
} 
+0

謝謝你的提示阿隆。訣竅是額外的MemberInfo。我新來表達樹。非常有幫助,雖然它沒有編譯,它足以顯示該怎麼做:-) –

+0

注意f.Nav在編譯時不可用 –

+0

@philsoady請編輯我的答案爲下一個人:) – Aron