c# - 如何在选择中加入多个表(Ef core)?
问题描述
表“产品”和“属性”不相关。但是每个产品都可以有一个属性列表。
为了向客户端发送带有附加属性和值的产品列表,我实现了以下逻辑: API 控制器方法:
[HttpGet("get")]
[AllowAnonymous]
public async Task<IActionResult> Get()
{
var productList = await _db.Product
.Include(p => p.Category)
.Include(p => p.ProductType)
.Take(25)
.ToListAsync();
var productListJson = await HandleProductEntities(productList);
return Ok(productListJson.ToString());
}
以及形成具有属性的产品 json-object 的方法:
private async Task<JArray> HandleProductEntities(IEnumerable<Product> productList)
{
if (productList == null) throw new ArgumentNullException(nameof(productList));
var productListJson = new JArray();
foreach (var productEntity in productList)
{
var attributesList = await _db.ProductAttributeValues
.Where(pav => pav.ProductId == productEntity.Id)
.Select(pav => new
{
Id = pav.AttributeValue.Attribute.Id,
Name = pav.AttributeValue.Attribute.Name,
DisplayName = pav.AttributeValue.Attribute.DisplayName,
Value = pav.AttributeValue.Value,
ValueDescription = pav.AttributeValue.Description
}).ToListAsync();
var jsonSerializerSettings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver()
};
var productJson = JObject.Parse(JsonConvert.SerializeObject(productEntity, jsonSerializerSettings));
var attrArrayJson = JArray.Parse(JsonConvert.SerializeObject(attributesList, jsonSerializerSettings));
foreach (var token in attrArrayJson)
{
var paramName = (string) token["name"];
if (paramName == null)
{
throw new NullReferenceException();
}
productJson.Add(paramName, token);
}
productListJson.Add(productJson);
}
return productListJson;
}
但是这个逻辑是超载的。可能有一种更简单的方法可以使用 EF 核心从数据库中获取具有属性的产品。有人能告诉我怎么做吗?
我试图这样做:
var resultTest = from productAttributeValue in _db.ProductAttributeValues
join attributeValue in _db.AttributeValue on productAttributeValue.AttributeValueId equals attributeValue.Id
join product in _db.Product on productAttributeValue.ProductId equals product.Id
join attribute in _db.Attribute on attributeValue.AttributeId equals attribute.Id
select new
{
Name = product.Name,
Attribute = attribute.Name,
AttributeValue = attributeValue,
};
但是不可能对每个产品的属性进行分组。
解决方案
from product in _db.Product
join pav in _db.ProductAttributeValues on product.Id equals
productAttributeValue.ProductId into productAttributeValueList
from productAttributeValue in productAttributeValueList.DefaultIfEmpty()
join attributeValue in _db.AttributeValue on productAttributeValue.AttributeValueId equals attributeValue.Id
join attribute in _db.Attribute on attributeValue.AttributeId equals attribute.Id
select new
{
Name = product.Name,
Attribute = attribute.Name,
AttributeValue = attributeValue
}
推荐阅读
- angular - Linting 错误:将此数组“排序”操作移至单独的语句
- android - Android studio 循环依赖
- unity3d - 在 Unity 3d 中检索多个 Set-Cookie 标头
- node.js - 如何安全地从 Electron 打开这个外部应用程序?
- python - GCM 数据的重新网格化/重新映射
- sql - 如何通过每天(白天/夜间)制作两组来获得组的平均值?
- c++ - 移动语义和深/浅复制之间有什么关系?
- jmeter - jmeter:我可以使用 jmeter JMeter“JMS 点对点”将消息发送到 MSFT Azure 服务总线队列吗?
- java - 由于格式不匹配导致日期空指针异常?爪哇
- c# - 为什么 iOS 和 Android 的 MonoGame 共享项目中没有 Activity1 类?