c# - 如何在 LINQ-TO-SQL 中映射来自 ExecuteQuery() 的额外字段但保留 LINQ 实体

标签 c# linq-to-sql executequery

假设我有一个位置表和一个相关的团队表 我需要从 ExecuteQuery() 调用中获取职位实体列表以及相关表中的团队名称。如:

var list = dc.ExecuteQuery<T>("SELECT Position.*, Team.Name  AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");

(我需要使用ExecuteQuery(),因为实际查询非常复杂。)

是的,我可以用 Position 类的所有字段加上 teamname 字段创建一个新的平面类,但我需要结果集是实际的 LINQ 实体,而不仅仅是 POCO,因为我将遍历这些记录并更新一些字段。

第一个想法,创建一个包含 Position 和新字段的新类

public class PositionExtended
{
   public Position position {get; set;}
   public string teamname {get; set;}
}

ExecuteQuery<PositionExtended>("SELECT Position.*, Team.Name  AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");

这正确映射了团队名称,但不是位置对象。


思路二,继承Position类:

public class PositionExtended : Position
{
   public string teamname {get; set;}
}

ExecuteQuery<PositionExtended>("SELECT Position.*, Team.Name  AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");

这将返回一个错误“该字段(Position 类的第一个字段)不是类型 PositionExtended 映射的一部分。该成员是否位于继承层次结构的根之上?”


最后的想法,使用分部类:

public partial class Position
{
   [Column(Name="TeamName")]
   public  string TeamName {get; set;}
}

ExecuteQuery<Position>("SELECT Position.*, Team.Name  AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");

这实际上适用于这个特定的 SQL 查询,但它更改了 Position 类,并且所有其他返回 Positions 的 LINQ 调用都失败了,因为 teamname 字段实际上并不是 Position 表的一部分,因此不会在查询中返回。

有没有人有解决这些想法的方法,或者更好的想法?

最佳答案

更好的主意:

在这些情况下使用 Dapper :)

另一个想法:

添加伪属性。

IOW,将TeamName 属性添加到Position 类。如果它是 null,则它没有被使用。也不要用 LINQ2SQL 属性修饰它。

还有一个想法:

如果您不关心改变对象,只需创建一个 View 并将其放入设计器中即可。如果需要,添加一些额外的属性以解析为真实实体。

关于c# - 如何在 LINQ-TO-SQL 中映射来自 ExecuteQuery() 的额外字段但保留 LINQ 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7884819/

相关文章:

java - statements.executeQuery() 之谜。代码没有被执行,也没有捕获异常。

c# - 如何填充嵌套列表

linq - 当字段需要首先解析时,如何在 linq 查询中进行过滤?

asp.net - LINQ - 'Could not translate expression' 以及以前使用过且经过验证的查询条件

.net - 从 LinqToSql 获取查询与映射速度?

java - 使用 MySQL 从 Java 中的多个表中选择带前缀的列

c# - 尝试在 .Net5 中发布时出现 Nuget 错误

c# - 如何在 C#.NET 的循环中创建不确定的后台线程

C# 创建 "wireframe"/3D "map"

php - 使用 PhP 执行准备好的语句