【问题标题】:Linq - cast anonymous type to concrete typeLinq - 将匿名类型转换为具体类型
【发布时间】:2015-02-04 11:39:47
【问题描述】:

我正在使用以下 linq 语句:

        var suppliers = SupplierView.Select()
            .GroupBy(x => x.Name.Substring(0, 1).ToUpper(),
                (alphanumeric, suppliers) => new
                {
                    Alphanumeric = alphanumeric,
                    Suppliers = suppliers.OrderBy(x => x.Name).ToList()
                })
            .OrderBy(x => x.Alphanumeric);

我想从方法中返回它,但是我相信我需要使用具体类型而不是匿名类型。

这是具体的类型:

public class AlphanumericSuppliers
{
    public string Alphanumeric { get; set; }
    public IOrderedEnumerable<Supplier> Suppliers { get; set; }
}

但是,我很难获得将匿名类型转换为具体类型的正确语法。

有人建议吗?

【问题讨论】:

  • 所以您知道如何创建匿名类型,但您不知道如何创建命名类型的实例,说真的......?
  • 我知道如何按照下面的代码进行操作,但它给了我语法错误。
  • 那么您应该包含错误消息。

标签: c# asp.net linq


【解决方案1】:

只需创建具体类型的实例(在 LINQ 中不需要使用匿名类型):

var suppliers = SupplierView.Select()
        .GroupBy(x => x.Name.Substring(0, 1).ToUpper(),
            (alphanumeric, suppliers) => new AlphanumericSuppliers // concrete
            {
                Alphanumeric = alphanumeric,
                Suppliers = suppliers.OrderBy(x => x.Name).ToList() // *
            })
        .OrderBy(x => x.Alphanumeric);

*如 cmets 中所述,要么将 Suppliers 更改为 IEnumerable&lt;Supplier&gt;,要么从此处删除 ToList 调用

【讨论】:

  • 除非您更改供应商的类型,否则不会编译。
  • @Selman22 是的。或者我认为删除ToList 电话会起作用。
  • @Selman22 - 你有正确的答案 - 如果你想让我选择一个答案,请发布一个答案。
猜你喜欢
  • 1970-01-01
  • 2015-04-25
  • 2010-10-22
  • 1970-01-01
  • 2011-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-27
相关资源
最近更新 更多