получение отдельных полей из запроса linq, который запускается из функции - PullRequest
0 голосов
/ 23 апреля 2020

У меня есть функция, которая возвращает результат linq:

  private IEnumerable<object> prepareData()
    {
        var data = from res in Globals.ds.Tables[0].AsEnumerable()
                     .GroupBy(x => new
                     {
                         art = x.Field<string>("artiste"),
                         alb = x.Field<string>("album"),
                     })
                      .Select(p => new
                      {
                          album = p.Key.alb,
                          artiste = p.Key.art,
                          count_lab = p.Count(),
                          lab = p.Select(x => x.Field<string>("label")).First(),
                          filp = p.Select(x => x.Field<string>("file_path")).First()
                      })
                     .OrderBy(x => x.lab)
                   select res;
        return data;
    }

Запрос работает хорошо, как задумано, я могу сделать data = PrepareData(); и получить правильные результаты.

Моя проблема когда я хочу сделать .where на data.

, если я сделаю:

var album = data.Where(x => x.

Тогда у меня нет никакой возможности выбрать одно поле (то же самое, если я хочу сделать .Select()). Я пытался data.AsEnumerable() и раньше, но безуспешно.

Я думаю, что IEnumerable<object> prepareData() является виновником, но я понятия не имею, как это исправить (если это так).

Мне нужна помощь

Заранее спасибо

1 Ответ

2 голосов
/ 23 апреля 2020

Если вы хотите выбрать одно поле, вы можете использовать: First() или FirstOrDefault(). Разница между этими двумя значениями:

  1. First() сгенерирует исключение, если элемент не найден.
  2. FirstOrDefault() вернет ноль, если элемент не найден.

Также, если вы хотите решить проблему с IEnumerable<object>, вам нужно создать класс DTO, в котором вы можете отобразить все элементы из списка.

Примерно так:

public class DTOClass 
{
   public string album { get; set; }
   public string artiste { get; set; }
   public string count_lab { get; set; }
   public string lab { get; set; }
   public string filp { get; set; }
}

И тогда в select вы можете просто сделать:

...
Select(p => new DTOClass {
  // map the values for DTO class here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...