ValueTuple.Create 中的命名参数 (2)

Named Parameters in ValueTuple.Create (2)

在另一个 中,我询问了 ValueTuple.Create 中的命名参数。但是由于我的示例代码不符合我的问题,所以我没有得到我想要的答案。所以我们再来一次:

第一个演示数据:

public class Product
    {
        public string Name { get; set; }
        public int CategoryID { get; set; }
    }

    public class Category
    {
        public string Name { get; set; }
        public int ID { get; set; }
    }

    public class Data
    {
        public IQueryable<Category> Categories { get; } = new List<Category>()
        {
            new Category(){Name="Beverages", ID=001},
            new Category(){ Name="Condiments", ID=002},
        }.AsQueryable();

        public IQueryable<Product> Products { get; } = new List<Product>()
        {
            new Product{Name="Cola",  CategoryID=001},
            new Product{Name="Tea",  CategoryID=001},
            new Product{Name="Mustard", CategoryID=002},
            new Product{Name="Pickles", CategoryID=002},
        }.AsQueryable();

    }

注意 IQueryable

然后是我的问题:

    public static IEnumerable<(int CategoryId, string ProductName)> GetList()
    {
        var data = new Data();
        return
            (from category in data.Categories
                join prod in data.Products on category.ID equals prod.CategoryID
                select ValueTuple.Create(category.ID, prod.Name)).OrderBy(e => e.Item2);
    }

但是如果我想要按产品名称排序的结果,我必须使用 OrderBy(e => e.Item2)。我能以某种方式去掉我的 Order by

中的 Item1 和 Item2 名称吗

因为我有一个 IQueryable 接口,所以我必须使用 ValueTuple.Create

我找到了一个解决方法:我可以制作一个类型案例:

    public static IEnumerable<(int CategoryId, string ProductName)> GetList()
    {
        var data = new Data();
        return
            (from category in data.Categories
                join prod in data.Products on category.ID equals prod.CategoryID
                select ((int CategoryId, string ProductName))ValueTuple.Create(category.ID, prod.Name)).OrderBy(e => e.ProductName);
    }