0

この質問では、Linq2SQL に相当する DbLinq を使用しています。実行時に返す列を指定する Linq2SQL クエリを生成する必要があります。Dynamic 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'

デバッガーでは、電話番号の値が結果ビューに表示されていることがわかります。問題は、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));

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

4

3 に答える 3

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();
于 2009-09-01T12:00:18.607 に答える
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);
}

この作業の一部を行う関数を作成する以外に、改善すべき点はあまりありません。オブジェクトは動的であるため、コンパイラはオブジェクトの内容を知りません。したがって、非反射コードの優れた機能はすべて利用できません。

于 2009-06-20T02:49:13.603 に答える
0

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

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

これが役に立てば幸いです。

于 2009-06-19T15:12:11.740 に答える