2016-08-05 4 views
2

文字列変数としてクラスプロパティ名があり、LINQクエリでそのプロパティを使用したいとします。下記の実施例:LINQラムダ式で文字列変数を使用

public class Demo 
{ 
    public string prop1 {get; set;} 
    public string prop2 {get; set;} 
    public string prop3 {get; set;} 
} 

私はこの

var data = db.Single<Demo>(d => d.prop1 == "value"); 

を行うことができますが、プロパティは、実行時にあると

string propname = "prop2"; 

のような、その文字列パラメータを取得することへの可能性があるものだかわかりませんラムダ式d => d.propname == "value"でそれを使用しますか?私はそれが可能であり、論理的に可能ではないとは思わない。質問を投稿して方法があるかどうかを確認することを考えました。提案してください。

注:Single()コールはMongoDB C# Driver以上で起こっているため、反射が機能するかどうかは不明です。

+3

おそらく、[Linq Expression](https://msdn.microsoft。com/fr-fr/library/system.linq.expressions(v = vs.110).aspx)(ラムダ式と混同しないでください)。パラメータを与えて、その場で正しい「もの」をコンパイルします。 – Sehnsucht

+0

両方とも所有者に答えても、それはMongoDB C#ドライバにあることを忘れていました。申し訳ありませんが、両方の答えが良いと妥当であることに関係なく、有効です。 – Rahul

+0

@Rahulあなたはそれを試しましたか? – squill25

答えて

4

(これは、その反射を実現することは、この特定のケースでは役に立たない前に提供元だった更新の回答については、以下の編集を参照してください。)

あなたはリフレクションを使用して気にしない場合は、あなたができる:

他の人がHを有するよう
var data = db.Single<Demo>(d => "value" == (string)typeof(Demo).GetProperty(propname).GetValue(d)); 

EDIT

MongoDBでこの作業をするためにはコメントにintedをつけて、あなたは "手で"という表現を構築しなければなりません。私は、次のステートメントを取る場合

だから、:今ことを除いて...

string propname = "prop1"; // you can now change this to any valid property name. 

var parameterExpresion = Expression.Parameter(typeof(Demo), "d"); 
var binaryExpression = Expression.Equal(
    Expression.Property(parameterExpresion, propname), 
    Expression.Constant("value")); 
var lambda = Expression.Lambda<Func<Demo, bool>>(binaryExpression, parameterExpresion); 

var data = db.Single<Demo>(lambda); 

var data = db.Single<Demo>(d => d.prop1 == "value"); 

私は同等である必要があり、次が、手でラムダ式を構築することを信じていますpropnameの値を任意の有効なプロパティ名に変更できる必要があります。それだけで動作するはずです。

手動でlambdaをビルドするときにコードがどれほど冗長になるかを見ると、私たちが気づかないうちに起こるすべてのコンパイラの魔法に感謝します。

+0

ありがとうsstan、しかし、 'MongoDB C#Driver'では' Single'呼び出しが起きているので、リフレクションが動作するかどうかは確かではありませんが、試してみる価値があります。 – Rahul

+0

あなたはそうです。私はそれがうまくいくとは思わない。 – sstan

+0

確信が持てません。試してみないと言うことはできませんが、それほど素晴らしい答えはありません。 – Rahul

4

編集:この回答はMongoDBでは機能しません。 @ sstanの答えを見てください。

@sstanが言ったように、あなたは、リフレクションを使用することができます。

var property = typeof(Demo).GetProperty("propertyName"); 
var data = db.Single<Demo>(d => (string)property.GetValue(d) == "value"); 

propertyメソッドGetValuePropertyInfoを有するタイプのオブジェクトです。このメソッドはオブジェクトを受け取り、そのオブジェクトの指定されたプロパティを返します。

@sstanの例では、typeof(Demo).GetProperty("propertyName")が(データベースのサイズに応じて)何百万ものオブジェクトごとに呼び出されます。それを一度入手して再利用する方が良いです。

+0

これをテストしましたか、これがエクスプレッションツリー外でどのように機能するのでしょうか? –

+0

@ johnny5いいえ私はMongoDBの問題が出てくる前に答えを投稿しました。 – squill25

+0

少なくとも私はそれをテストし、それは働いた。 – Andrew

関連する問題