繁体   English   中英

左外连接使用 LINQ 查询语法 EF Core C#

[英]Left outer join using LINQ Query Syntax EF Core C#

我对以下内容有疑问,

  1. 未通过外键连接的两个表的左外连接。
  2. 按第二个表中匹配的结果排序。
  3. 我希望在 LINQ 查询方法语法中完成此操作,因为我根据提供的输入以及跳过和限制添加了许多条件。

如果我们有以下产品和收藏表

在此处输入图像描述

在此处输入图像描述

所以我想要的 output 是:

在此处输入图像描述

将收藏夹作为第一组的一部分的含义,而不是收藏夹应该放在它们后面。 以下是我所做的尝试。 我能够加入表格获得 output 但不确定如何确保在第一页中我得到所有的喜爱。

这个答案非常接近我的想法,但是它得到了结果,然后进行了排序,这在我的情况下是不可能的,因为我正在进行分页并使用 IQueryable 来获取更少的数据。

Group Join 和 Orderby,同时保持之前的查询

对任何解决方案持开放态度以实现相同目标。

[Table("Product")]
public class ProductModel
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public Guid ProductId { get; set; }
    public string ProductName {get; set;}
    public bool IsFavorite { get; set; }
}

[Table("UserFavorite")]
public class UserFavoriteModel
{
    [Required]
    public Guid UserId { get; set; }
    [Required]
    public Guid Identifier { get; set; }
    [Required]
    public FavoriteType Type { get; set; }
}

// Gets products
private async Task<List<ProductModel>> GetProductsAsync(
    Guid categoryId, 
    Guid subCategoryId, 
    int from,
    int limit)
{
    var query = _context.Products.AsQueryable();

    if (!string.IsNullOrEmpty(categoryId))
        query = query.Where(product => product.CategoryId == categoryId);
    if (!string.IsNullOrEmpty(subCategoryId))
        query = query.Where(product => product.SubCategoryId == subCategoryId);

    query = query.Skip(from).Take(limit);

    var products = await query.ToListAsync();

    query = query.GroupJoin(
    _context.Favorites.AsNoTracking()
    .Where(favorite => favorite.Type == FavoriteType.FASHION)
    // This user Id will come from context just adding for overall picture.
    .Where(favorite => favorite.UserId == userId),
    //This orderby if I add will not make any difference.
    //.OrderByDescending(favorite => favorite.Identifier),
    v => v.ProductId,
    f => f.Identifier,
    (product, fav) => new { product, fav }).
    SelectMany(x => x.Fav.DefaultIfEmpty(),
                    (x, y) => SetFavorite(x.Project, y));

}

private static ProductModel SetFavorite(ProductModel v, UserFavoriteModel si)
{
    v.IsFavorite = (si != null);
    return v;
}

我会做这样的事情:

var query =
   _context.Products.AsQueryable().Select(p => new ProductModel {
      ProductId = p.ProductId,
      ProductName = p.ProductName,
      IsFavorite =
         _context.Favorites.Any(f =>
            f.Identifier = p.ProductId &&
            f.Type == FavoriteType.FASHION &&
            f.UserId == userId
         )
   }).OrderByDescending(favorite => favorite.Identifier);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM