2009-06-19 4 views
0

私はこの質問のLinq2SQLに相当するDbLinqを使用しています。私は実行時に返すカラムを指定するLinq2SQLクエリを生成する必要があります。私は動的Linq拡張メソッドを使用してそれを達成することができますが、私は結果を抽出する方法を解決することはできません。ダイナミッククラスに含まれるLinqの結果にアクセス

string someProperty = "phonenumber"; 
string id = "1234"; 

Table<MyClass> table = context.GetTable<MyClass>(); 
var queryResult = (from item in table where item.Id == id select item).Select("new (" + someProperty + ")"); 

LINQの式は、の適切なSQLを生成:

select phonenumber from mytable where id = '1234' 

をデバッガで私がPHONENUMBER値が結果ビューにそこに座っていることがわかります。問題は、私はqueryResultオブジェクトからphonenumberの値を取得する方法を考えることができないのですか? QueryResultではの種類は次のとおりです。

QueryProvider<DynamicClass1> 

編集: 私はそれを行うための方法を発見したが、それは非常に粗製のようです。

IEnumerator result = (from item in table where item.Id == id select item).Select("new (" + someProperty + ")").GetEnumerator(); 
result.MoveNext(); 
var resultObj = result.Current; 
PropertyInfo resultProperty = resultObj.GetType().GetProperty(someProperty); 
Console.WriteLine(resultProperty.GetValue(resultObj, null)); 

おそらく誰かがよりクリーンな方法を知っていますか?

答えて

0

ソリューションでした:

string someProperty = "phonenumber"; 
PropertyInfo property = typeof(T).GetProperty(propertyName); 
string id = "1234"; 
Table<MyClass> table = context.GetTable<MyClass>(); 
Expression<Func<T, Object>> mySelect = DynamicExpression.ParseLambda<T, Object>(property.Name); 
var query = (from asset in table where asset.Id == id select asset).Select(mySelect); 
return query.FirstOrDefault(); 
0

Linqは遅延実行メソッドを使用してデータを取得します。 Deferred executionは、実際の値が実際に必要になるまで、式の評価が遅れることを意味します。

あなたのケースでは、queryResultはIEnumerableオブジェクトです。これは、データがまだ実際に評価されていないことを意味します。 result.ToList()またはresult.ToDictionary()を呼び出すか、IEnumerable以外のデータ型でオブジェクトを返すその他のメソッドを呼び出すことによって、queryResultオブジェクトを評価できます。

希望すると便利です。

+0

問題は、動的LINQの選択の拡張メソッドをIQueryableを対象としませのIQueryableオブジェクトを返しますがあります。その結果、便利なToListメソッドのどれも利用できません。私は最終的にそれらのメソッドはちょうどIEnumberatorを使用している必要がありますと思うが、とにかくボンネット。 – sipwiz

0

ソリューションの動的な側面によって、リフレクションを使用する必要があります。 IQueryableの "ElementType"プロパティを使用すると、最初のアイテムを取得してそのタイプを読み取るのではなく、そこで、このようなループが良いかもしれません:

はあなたのために、この作業の一部を行うための関数を作成するためのショート
var result = (from item in table where item.Id == id select item).Select("new (" + someProperty + ")"); 
PropertyInfo resultProperty = result.ElementType.GetProperty(someProperty); 
foreach (var resultObj in result) 
{ 
    var value = resultProperty.GetValue(resultObj, null); 
} 

、かなり改善することが残されていません。コンパイラは動的なのでオブジェクトの内容を知りません。したがって、非反射コードのすべての正しさは利用できません。

関連する問題