Запрос LINQ для сущностей с объединением, возвращающий элементы по категориям - PullRequest
1 голос
/ 08 мая 2020

Я использую ядро ​​Entity Framework. У меня есть следующие объекты:

public class Category {
    public long Id { get; set; }
    public string Name { get; set; }
}

public class Product {
    public long Id { get; set; }
    public long CategoryId { get; set; }
    public string Name { get; set; }
}

Я хотел бы получить группировку, в которой мой ключ - это моя Категория, а у меня есть список продуктов. Я хотел бы сделать это, выполнив один запрос к базе данных.

var data = context.Categories
            .Join(
                Products,
                c => c.Id,
                p => p.CategoryId,
                (c, p) => new {
                   Category = c,
                   Product = p
               }
            )
            .ToList();

Это запускает запрос, который я хочу, и, кажется, создает список с анонимным объектом, который имеет категорию и продукт. Если я сделаю следующее, он сделает то, что я хочу:

var grouped = data.GroupBy(x => new { x.Category });

Ключ в порядке, но список значений, похоже, повторяет Категории. Есть ли способ сделать так, чтобы у меня был ключ, являющийся категорией, а затем значения - это список объектов продукта? Я бы предпочел синтаксис метода, но на этом этапе я, надеюсь, смогу выяснить синтаксис запроса, если это то, что мне кто-то может достать.

Ответы [ 4 ]

1 голос
/ 08 мая 2020

Это отличный список товаров, сгруппированных по категориям

public class Category {
    public long Id { get; set; }
    public string Name { get; set; }
}

public class Product {
    public long Id { get; set; }
    public long CategoryId { get; set; }
    public string Name { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        ICollection<Category> categories = new Collection<Category>(new List<Category>());
        ICollection<Product> products = new Collection<Product>(new List<Product>());

        var data = categories
        .Join(
            products,
            c => c.Id,
            p => p.CategoryId,
            (c, p) => new {
               Category = c,
               Product = p
           }
        )
        .ToList();

        var grouped = data.GroupBy(o => o.Category, o => o.Product);
    }
}
1 голос
/ 08 мая 2020

Правильное решение будет примерно таким:

var result = (from p in context.Products
              join c in context.Categories
                  on p.CategoryId equals c.Id
              select new
              {
                  Product = p,
                  Category = c
              })
              .ToList() // because still grouping object is not supported in EF Core we have to materialize first and then do our grouping
              .GroupBy(g => g.Category, g => g.Product)
              .ToDictionary(p => p.Key, p => p.ToList());
1 голос
/ 08 мая 2020

Попробуйте следующее:

   class Program
    {
        static void Main(string[] args)
        {
            Context context = new Context();

            var results = (from c in context.Categories
                           join p in context.Products on c.Id equals p.CategoryId
                           select new { category = c, product = p })
                          .GroupBy(x => x.category.Id)
                          .ToList();
        }
    }
    public class Context
    {
        public List<Category> Categories { get; set; }
        public List<Product> Products { get; set; }
    }
    public class Category
    {
        public long Id { get; set; }
        public string Name { get; set; }
    }

    public class Product
    {
        public long Id { get; set; }
        public long CategoryId { get; set; }
        public string Name { get; set; }
    }
0 голосов
/ 03 июня 2020

Вот как я его решил:

var grouped = data
    .GroupBy(x => new { x.Category })
    .Select(x => new {
        Category = x.Key.Category,
        Products = x.ToList().Select(x => x.Product).ToList()
    });;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...