Проблема с непатентованным перечислением 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; }
}
Решение
Вы не можете ожидать, что тип вашего динамического объекта будет разрешен во время компиляции, когда ваш запрос будет разрешен во время выполнения.Вот что такое dynamic linq вообще :это позволяет вам выполнять динамические запросы за счет проверки во время компиляции.
Вы должны использовать отражение для доступа к свойствам динамического типа, по крайней мере, до C # 4.
Другие советы
Если IEnumerable не является универсальным, то вам следует использовать приведение, а не отражение.