【问题标题】:Linq select new dynamic multi part List<>Linq 选择新的动态多部分列表<>
【发布时间】:2015-05-25 12:28:25
【问题描述】:

我正在处理以下查询:

public void FindAllRelatedProdsByParentCat(CategoryService categoryService, string parentCatName, bool isDeleted)
{
    List<Category> allCats = categoryService.FindAll(isDeleted).ToList();

    var results = (from a in allCats.Where(x => x.Name == parentCatName)
                   join b in allCats 
                   on a.CategoryId equals b.Parentcategory into children
                   select new 
                         { 
                           ParentId = a.CategoryId, 
                           ChildrenIds = children.Select(z => z.CategoryId) 
                         }).ToList();
}

理想情况下,我想要将 select new 语句展平为 Id 对象的通用类型列表。目前我必须用两个属性组成一个匿名对象来获得我想要的东西。有人可以帮我将其重构为一个平面列表吗?这可行吗?

更新:类别实体是什么样的:

public class Category : EntityBase
{
    public Category()
    {
        Products = new List<Product>();
    }

    public Guid CategoryId { get; set; }
    public string Name { get; set; }
    public Guid? Parentcategory { get; set; }
    public bool IsDeleted { get; set; }
    public Guid OrgId { get; set; }
    public virtual List<Product> Products { get; set; }
    public virtual Organization Organization { get; set; }
}

【问题讨论】:

  • 您想要一个包含ParentIdChildrenIds 的列表?
  • 是的,这正是我想要的。只是不知道如何重构它。
  • allCats 是什么类型?为什么在同一个可枚举对象上有一个Join
  • 你能添加你的Category类型声明吗?
  • @IbrarMumtaz 我不明白你想要获得什么...你想要一个 List&lt;int&gt; 与所有 parent.CategoryIdchild.CategoryId 一起吗?

标签: c# linq refactoring


【解决方案1】:

我不知道我是否明白你想要什么,但是

var results = (from a in allCats.Where(x => x.Name == parentCatName)
               join b in allCats on a.CategoryId equals b.Parentcategory into children
               select new[] { a.CategoryId }.Concat(children.Select(z => z.CategoryId)))
              .SelectMany(x => x)
              .ToList();

我已经在 Entity Framework 6.1.3 上对其进行了测试,它正确地为select 行生成了一个UNION ALL...然后为CROSS APPLY 使用CROSS APPLY 来生成SelectMany (???)

【讨论】:

  • = ),这就是我想要的。我不知道你能做到这一点。太好了,这也是我正在使用的。
  • @IbrarMumtaz 请注意,我错过了)。代码已更改。
  • 您能否为我的问题建议一个更好的标题,以便对其他人更有帮助??
  • @IbrarMumtaz 将父子 ID 与 LINQ 放在一起
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2013-05-07
相关资源
最近更新 更多