从一个函数运行的linq查询中获取单个字段。

问题描述 投票:0回答:1

我有一个函数,返回一个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() 是罪魁祸首,但我不知道如何解决这个问题(如果是这样的话)。

我需要帮助

先谢谢你

c# linq
1个回答
2
投票

如果你想选择一个单一的字段,你可以使用。First()FirstOrDefault(). 这两者的区别是。

  1. First() 如果找不到元素,将抛出异常。
  2. FirstOrDefault() 如果没有找到元素,将返回null。

另外,如果你想解决 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
}
© www.soinside.com 2019 - 2024. All rights reserved.