按照 EF Core 的方式使用 Dapper 会错误地返回 SQL 的结果

问题描述 投票:0回答:1

实体:

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 相同的结果:

c# sql asp.net-core relational-database dapper
1个回答
1
投票

我同意 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;
    });

这里是文档:https://www.learndapper.com/relationships

© www.soinside.com 2019 - 2024. All rights reserved.