非ジェネリックIQueryable列挙問題
-
05-07-2019 - |
質問
動的linqの使用( http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library .aspx )IQueryableを返す以下のクエリを実行します。 IEnumerableでもあるこの結果では、Count()を実行できますが、値を取得するToList()はありません。 foreachを使用してそれらを列挙できますが、結果の匿名型の個々のフィールドにリフレクションなしでアクセスすることはできません。これが唯一の方法ですか?ありがとう
var query =
db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
OrderBy("CompanyName").
Select("New(CompanyName as Name, Phone)");
foreach (var item in query)
{
foreach (var prop in item.GetType().GetProperties())
{
Console.WriteLine(prop);
}
}
キャストを試みましたが、「DynamicClass1」タイプのオブジェクトを「Test」タイプにキャストできませんでしたエラーが発生しました。
foreach (var item in query)
{
Console.WriteLine("{0}: {1}", ((Test)item).CompanyName, ((Test)item).Phone);
}
public class Test {
public string CompanyName { get; set; }
public string Phone { get; set; }
}
解決
クエリが実行時に解決される場合、コンパイル時に動的オブジェクトのタイプが解決されることは期待できません。それが動的linqのすべてです:コンパイル時のチェックを犠牲にして動的クエリを実行できます。
少なくともC#4まで、動的タイプのプロパティにアクセスするにはリフレクションを使用する必要があります。
他のヒント
IEnumerableがジェネリックでない場合、リフレクションを使用するのではなく、キャストする必要があります。
所属していません StackOverflow