Linq一对多关系为逗号分隔值

时间:2018-02-10 17:19:27

标签: entity-framework linq join

我有一个产品表,与另外两个表有一对多的关系。

产品

  1. 产品编号
  2. 产品名称
  3. IsDeleted(位)
  4. ProductTag

    1. ProductTagId
    2. 产品编号
    3. 标签名
    4. IsDeleted(位)
    5. 产品分类

      1. ProductCategoryId
      2. 产品编号
      3. 类别名称
      4. IsDeleted(位)
      5. 我需要在单个linq查询中得到如下结果,并且在使用join时我还需要检查IsDeleted标志。请帮忙。

        必需的输出:

        1 | Adidas_Shoes | shoes,new,adidas,sport | Mens,Shoes,Adidas 
        

        刚尝试加入1个表格如下

          

        (来自p.ProductId中的ProductTag中的产品连接p中的p等于   pt.ProductId from productTags from productTags.DefaultIfEmpty()   where(pt == null ||!pt.IsDeleted)选择新的{ProductId =   p.ProductId,ProductName = p.ProductName,Tags = string.Join(",",   pt.TagName.ToArray())})。Distinct()。ToList()

1 个答案:

答案 0 :(得分:1)

你应该发布一些你尝试过的代码,也许是你的DbContext的精简版本,但最后你需要迭代你的产品并保持连接标签和类别名称

var query = from product in context.Products
            let tags = from tag in context.Tags
                        where !tag.IsDeleted
                            && tag.ProductId == product.ProductId
                        select tag.TagName
            let categories = from category in context.Categories
                        where !category.IsDeleted
                         && category.ProductId == product.ProductId
                        select category.CategoryName
            where !product.IsDeleted
            select new
            {
                Id = product.ProductId,
                Name = product.ProductName,
                Tags = string.Join(", ", tags)
                Categories = string.Join(" ", categories)
            };

注意:由于缺少任何映射信息,我只是假设您没有定义导航属性,但可以随意调整以上内容以匹配您的特定设置

注意:如果您发现自己总是从查询中排除已删除的实体,您应该开始考虑处理EF soft delete方案,其中一个是处理歧视器

  modelBuilder.Entity<Foo>().Map(m => m.Requires("IsDeleted").HasValue(false));
  modelBuilder.Entity<Bar>().Map(m => m.Requires("IsDeleted").HasValue(false));