Пользовательский объект с вложенной коллекцией

#c#

#c#

Вопрос:

Я создал объект, который содержит другую коллекцию в одном из своих свойств.

Это основной объект:

 public class MeterPrevReadInfo
{
    public int JobMeterID { get; set; }
    public string PreviousJobReference { get; set; }
    public FuelType MeterFuelType { get; set; }
    public List<MeterPrevReadRegInfo> Regs { get; set; }
    public DateTime DateMeterRead { get; set; }
}
  

Это дочерний объект:

 public class MeterPrevReadRegInfo
{
    public string RegisterID { get; set; }
    public string MeterRead { get; set; }
}
  

Мне нужно привязать этот объект к элементу управления repeater, я хотел бы показать свойство DateMeterRead и все свойства MeterRead в repeater.

Возможно ли это с помощью Linq? Я мог бы легко сделать это, используя запрос t-sql из базы данных, но я просто подумал, что это должно быть возможно сделать в памяти без дополнительных затрат на повторное обращение к базе данных.

Ответ №1:

Не запутывайтесь — LINQ не является уровнем доступа к данным или ORM (возможно, вы имеете в виду LINQ-to-SQL или LINQ-to-Entities?)

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

Я мог бы легко сделать это, используя запрос t-sql из базы данных, но я просто подумал, что это должно быть возможно сделать в памяти без дополнительных затрат на повторное обращение к базе данных.

Вы можете извлечь все эти данные из базы данных в одном запросе, а затем создавать объекты. Вы можете сделать это с помощью хранимой процедуры, LINQ-to-SQL, Entity Framework или других инструментов. Вы должны выбрать лучший инструмент для ваших требований. Я ожидаю, что это очень небольшая часть требования, поэтому сделайте шаг назад, выберите лучший инструмент и выполните эту работу, используя этот инструмент.

Ответ №2:

уверен, что это возможно. Похоже, вы хотите что-то вроде этого:

  List<MeterPrevReadInfo> list = ...;

 var result = from item in list
              from info in item.Regs
              select new {item.DateMeterRead, info.MeterRead};
  

Этот запрос определяет список анонимных объектов с двумя нужными вам свойствами.

Ответ №3:

Вы можете получить доступ к анонимному объекту, представляющему нужную вам модель, используя метод расширения Linq Select следующим образом:

 var readInfo = new MeterPrevReadInfo();
readInfo.Regs.Select(x => new {
                                        x.RegisterID, 
                                        x.MeterRead, 
                                        readInfo.DateMeterRead
                                       });