我有一个产品表,与另外两个表有一对多的关系。
产品:
ProductTag :
产品分类:
我需要在单个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()
答案 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));