2016-11-02 2 views
1

У меня есть приложение, написанное на C#. В этом приложении у меня есть код, который соединяет некоторые данные между двумя источниками данных. Этот код выглядит следующим образом:LINQ - создание свойства для хранения результата оператора LINQ

Result result = new Result(); 

var items = from userOrder in UserOrders 
      join product in UserProducts on userOrder.OrderId equals prodcut.OrderId 
      orderby userOrder.Date, product.Name 
      select new 
      { 
       OrderDate = userOrder.Date, 
       ProductName = product.Name, 
      }; 
result.Items = items.ToList(); 

Последняя строка кода создает ошибку во время компиляции, который говорит:

Cannot implicitly convert type 'System.Collections.Generic.List<<anonymous type: DateTime OrderDate, string ProductName>>' to 'System.Collections.Generic.List<dynamic>' 

Как сообщается эта ошибка, Items свойство на моем Result объекта в настоящее время является List<dynamic>. Я могу изменить тип этого свойства. Но мне нужно это свойство, чтобы в своем отчете я мог пропустить Items. Мой вопрос: какой тип собственности должен быть Items?

+0

Возможно, вам понадобится создать класс DTO, если это EF. Похожее: http: //stackoverflow.com/questions/39277515/entity-framework-add-local-data-to-list-from-database –

+1

Просто сделайте 'результат.Items = item.Cast () .ToList(); 'Вам очень нужно' AsEnumerable() 'перед' Cast', если это EF. Но вам лучше создать конкретный класс вместо использования анонимных классов и динамических. – juharr

+0

Комментарий Op @juharr работает, поэтому вы должны использовать его, если хотите динамику. Нечего исправить. – mybirthname

ответ

2

Вы бросаете этот список анонимный объект с этой линией:

select new 
      { 
       OrderDate = userOrder.Date, 
       ProductName = product.Name, 
      }; 

Try добавить тип result.Items после Нового:

select new TYPE 
       { 
        OrderDate = userOrder.Date, 
        ProductName = product.Name, 
       }; 

Edit: это выглядит как тип Элементы могут быть списком динамических? Вы должны создать для них жесткий тип. Ваши микшированные динамические и анонимные объекты.

Вы можете сделать:

result.Items = ((IEnumberable<dynamic>)items).ToList(); 

Но я обычно рекомендую только с помощью жестких типов, потому что вы получаете компилировать проверку типа и не впадать в ошибки, как вы имеете здесь.

Edit2: Вот пример тем, что я имею в виду «жесткий» тип

public class UserOrderProduct 
      { 
       public DateTime OrderDate { get; set; } 
       public string ProductName { get; set; } 
      } 

Теперь окончательный выбор будет:

select new UserOrderProduct 
      { 
       OrderDate = userOrder.Date, 
       ProductName = product.Name, 
      }; 

И не забудьте изменить тип результата .Items к:

List<UserOrderProduct> 
1

Почему он не работает

Вы пытаетесь присвоить объект result.Items, который не соответствует определенному типу. result.Items является динамическим, и вы назначаете ему анонимный тип.

Как исправить

Просто создать класс для хранения результатов агрегированных данных.

public class OrderDetailsSummary 
{ 
    public DateTime OrderDate { get; set; } 
    public string ProductName { get; set; } 
} 

Измените запрос Linq, чтобы использовать его.

select new OrderDetailsSummary 
{ 
    OrderDate = userOrder.Date, 
    ProductName = product.Name, 
}; 

Измените свойство Items на класс результата на тип OrderDetailsSummary.

Смежные вопросы