Именованные параметры в ValueTuple.Create - PullRequest
4 голосов
/ 15 марта 2019

Я играл с Ценой Значения в C #.

Сначала некоторые демонстрационные данные:

  #region Data
    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 List<Category> Categories { get; } = new List<Category>()
        {
            new Category(){Name="Beverages", ID=001},
            new Category(){ Name="Condiments", ID=002},
        };

        public List<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},
        };

    }
    #endregion

Затем метод с использованием демонстрационных данных:

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);
}

Пока проблем нет.

Но еслиЯ хочу, чтобы результат сортировался по названию продукта. Я могу сделать следующее:

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);
        }

И здесь у меня возникает проблема: при использовании ValueTuple.Create (...) я могу назвать параметры, чтобы имена моглибыть использованным в OrderBy

Я надеялся на что-то вроде этого:

select ValueTuple.Create(CategoryId : category.ID, ProductName : prod.Name)

, а затем использовать имя в моем порядкеBy:

OrderBy(e => e.ProductName)

Ответы [ 2 ]

6 голосов
/ 15 марта 2019

Вы можете напрямую создать именованный кортеж в вашем Select и точно указать имена:

(
    from category in data.Categories
    join prod in data.Products on category.ID equals prod.CategoryID
    select (CategoryId: category.Id, ProductName: prod.Name)
).OrderBy(e => e.ProductName);
1 голос
/ 15 марта 2019

Может быть, лучше обеспечить одинаковый стиль для всех запросов linq. Я имею в виду использовать "orderby", прежде чем выбрать.

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
                orderby prod.Name
                select ValueTuple.Create(category.ID, prod.Name);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...