实体:
public record ProductAttribute
{
public int Id { get; set; }
public string Name { get; set; }
public string? Link { get; set; }
public AttributeType Type { get; set; }
public List<ProductAttributeValues> AttributeValues { get; set; } = new();
}
public record ProductAttributeValues
{
public int Id { get; set; }
public required string Name { get; set; }
public string? value { get; set; }
public int ProductAttributeId { get; set; }
public ProductAttribute ProductAttribute { get; set; } = new();
}
我正在尝试使用 Dapper 来获取
ProductAttribute
及其 ProductAttributeValues
,就像 EF Core 使用 .Include()
那样。
SQL:
select pa.Id,pa.Name,pa.link,pa.Type,pav.Id as AttributeId,pav.Name,pav.value,pav.ProductAttributeId
from productattributes pa
inner join productattributevalues pav
on pav.ProductattributeId = pa.Id
C#:
var attributeResult = await connection.QueryAsync
<ProductAttribute, ProductAttributeValues, ProductAttribute>(sql, (attributes, attributevalues) => {
attributes.AttributeValues.Add(attributevalues);
return attributes;
}, splitOn: "AttributeId");
对于
attributevalue
中的每个 ProductAttribute
,返回一行:
它应该返回 2 个
Attribute
,其中之一返回 3 个 attrValue
。它返回与 SQL 相同的结果:
我同意 Chris Shaller 的观点,EF 在性能方面成为了一个非常强大的工具。
但是要遵循您的方法,您必须对结果进行分组:
var result = attributeResult.GroupBy(p => p.Id).Select(g =>
{
var productAttribute = g.First();
productAttribute.AttributeValues = g.Select(p => p.AttributeValues).ToList();
return productAttribute;
});