Неуниверсальная проблема перечисления IQueryable - PullRequest
0 голосов
/ 07 марта 2009

Использование динамического linq (http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx). Я запускаю приведенный ниже запрос, который возвращает IQueryable. По этому результату, который также является IEnumerable, я могу запустить Count (), однако для получения значения. Я могу перечислять их, используя 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; }

}

Ответы [ 2 ]

1 голос
/ 07 марта 2009

Вы не можете ожидать, что тип вашего динамического объекта будет разрешен во время компиляции, когда ваш запрос будет решен во время выполнения. Вот что такое динамический linq: он позволяет вам выполнять динамические запросы при проверке времени компиляции.

Вы должны использовать отражение, чтобы получить доступ к свойствам динамического типа, по крайней мере, до C # 4.

0 голосов
/ 07 марта 2009

Если IEnumerable не является универсальным, то вам следует разыграть, а не использовать отражение.

...