EF Core 2.2 «Получить список из многих» - PullRequest
0 голосов
/ 05 мая 2019

У меня есть отношение «многие ко многим» с 3 таблицами:

Products
Categories
ProductCategories

Как я могу получить или получить список категорий (не список категорий продуктов) по продукту

Ответы [ 3 ]

0 голосов
/ 05 мая 2019

Используйте это, я думаю, это полезно:

var result = (from pc in ProductCategories
               join c in Categories on pc.CategoryId equals c.CategoryId 
               join p in Products on pc.ProductId equals p.ProductId 
               select new Category { //any selector you need in Category }).ToList();
0 голосов
/ 07 мая 2019

Вы можете использовать Include() и ThenInclude() до загрузить связанные данные .

Например, если у меня есть такие модели, как

 public class Product
{
    [Key]
    public int Id { get; set; }
    public string Name { get; set; }

    public ICollection<ProductCategory> ProductCategories { get; set; } = new List<ProductCategory>();
}

public class Category
{
    [Key]
    public int Id { get; set; }

    public string Name { get; set; }

    public ICollection<ProductCategory> ProductCategories { get; set; } = new List<ProductCategory>();

}
public class ProductCategory
{
    [Key]
    public int ProductId { get; set; }
    public Product Product { get; set; }

    [Key]
    public int CategoryId { get; set; }
    public Category Category { get; set; }
}

Доступ к списку категорий по продукту

//select specific product whose Id is 1 
var product = await _context.Products.Include(p => p.ProductCategories)
                                              .ThenInclude(pc => pc.Category)
                                              .FirstOrDefaultAsync(p => p.Id == 1);


var categories = product.ProductCategories.Select(pc => pc.Category).ToList();
0 голосов
/ 05 мая 2019

У меня была такая же проблема, и я решил ее, вернув JSON_QUERY

CREATE OR ALTER PROCEDURE [Account].[GetByProduct]
    @ProductId
AS
BEGIN
    SELECT 
        P.*,
        PC.*
        JSON_QUERY((
            SELECT 
                C.*
            FOR JSON PATH
        )) AS [Categories]
    FROM 
        [Relation] AS R
        INNER JOIN [Product] AS P
        ON P.[Id] = R.[ProductRef]
        INNER JOIN [ProductCategory] AS PC
        ON PC.[Id] = R.[ProductCategoryRef]
        INNER JOIN [Category] AS C
        ON C.[Id] = AR.[CategoryRef]
    WHERE
        P.[Id] = @ProductId
END

Примечание. Я бы переименовал столбцы и таблицы в единственное, а не во множественное число.

На стороне EF Core вам придется применить преобразование , используя JSON для List.

...