首页 > 解决方案 > 从函数运行的 linq 查询中获取单个字段

问题描述

我有一个返回 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();并获得正确的结果。

我的问题是当我想.wheredata.

如果我做 :

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

然后我没有任何选项来选择单个字段(如果我想做一个字段也是一样的.Select())。我以前试过data.AsEnumerable()但没有成功。

我认为这IEnumerable<object> prepareData()是罪魁祸首,但我不知道如何解决这个问题(如果是这样的话)。

我需要帮助

提前致谢

标签: c#linq

解决方案


如果要选择单个字段,可以使用: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(p => new DTOClass {
  // map the values for DTO class here
}

推荐阅读