将查询结果映射到“未映射”属性

Map result from query to Not Mapped property

提问人:Răzvan Puștea 提问时间:10/14/2023 最后编辑:marc_sRăzvan Puștea 更新时间:10/14/2023 访问量:49

问:

我使用字符串构建了我的查询。除其他事项外,以下是我选择的内容:

SELECT 
    ..., 
    [CST].CompanyName AS 'CustomerName', 
    CONCAT([CON].FirstName, ' ', [CON].LastName) AS 'BuyerName'
...

我的模型有 2 个属性:和 。[NotMapped]CustomerNameBuyerName

我正在使用 EF Core 3.1。如何告诉 EF 从 和 列返回的内容应映射到具有相同名称的属性?CustomerNameBuyerName[NotMapped]

我试过这个:

var estimates = _context.Estimates
   .FromSqlRaw(sqlString)
   .AsNoTracking()
   .Select(s => new Estimate
   {
       // lazy load
       BuyerName = s.Customer.CompanyName,
       CustomerName = s.CustomerContact.FirstName + " " + 
          s.CustomerContact.LastName
   })
   .ToList();

它有效,但它执行了 2 个不必要的连接(我已经在我的变量中执行了)。sqlString

C# .NET 实体框架 LINQ

评论

0赞 Gert Arnold 10/14/2023
FromSqlRaw只返回一个平面结果集。EF 在此平面表中没有(也不可能有)任何层次结构的概念。因此,如果您使用它,则必须加入才能访问记录。s.Customer.CompanyNameCustomer
0赞 Răzvan Puștea 10/14/2023
@GertArnold:那我该怎么办?如果我选择此选项,我的查询将具有相同的联接(效率低下)。
0赞 Svyatoslav Danyliv 10/15/2023
您在这里唯一的选择是 Dapper。EF 不分析 SQL 来了解加载或未加载的内容。此外,请考虑使用 DTO 而不是投影到 Entity 类。
1赞 Răzvan Puștea 10/16/2023
@SvyatoslavDanyliv:你是救命恩人!!我已经为此苦苦挣扎了好几天。使用 Dapper 解决了很多问题(不仅仅是这个问题)。多谢!❤️

答: 暂无答案