2

DynamicQueryable.Select() // 動的選択ライブラリを使用しています

これまでに見つけた唯一のドキュメントはSystem.Linq.Dynamic ドキュメントです

動作する匿名の戻り値の型を持つこのクエリがあります。

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}) は期待どおりに機能します

私の質問 select(t=> new {t,t.Nav1}) と同等のことをどのように行うことができますか

私は .Select("new (it,Nav1) ") と .Select("new (this,Nav1) ") を試しました

結果は、メンバーが見つからないという解析エラーでした。この動的文字列解析 API を知っている人はいますか?

または同等の構築構文もオプションです。

注: Nav プロパティ ForSourceRecord は実行時にのみ認識されます。それ以外の場合は、通常のラムダ式を使用します。

4

1 に答える 1

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");
}
于 2013-06-27T02:57:21.093 に答える