如何在LINQ- to - sql中从ExecuteQuery()映射一个额外的字段,但保留LINQ实体

本文关键字:一个 字段 LINQ 实体 保留 映射 to LINQ- sql ExecuteQuery 中从 | 更新日期: 2023-09-27 18:12:31

假设我有一个Position表和一个相关的Team表我需要从ExecuteQuery()调用中获得Position实体的列表,以及来自相关表的团队名称。如:

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");

这正确地映射了teamname,但不是position对象。


第二个想法,继承自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类,并且所有其他LINQ调用返回Position失败,因为teamname字段实际上不是Position表的一部分,因此不会在查询中返回。

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

如何在LINQ- to - sql中从ExecuteQuery()映射一个额外的字段,但保留LINQ实体

更好的主意:

在这种情况下使用Dapper:)

另一个想法:

添加一个伪属性。

现在,将TeamName属性添加到Position类中。如果是null,表示没有被使用。也不要用LINQ2SQL属性来修饰它。

还有一个想法:

如果你不关心对象的变化,只需创建一个视图并将其拖放到设计器中。如果需要,添加一些额外的属性来解析真实的实体。

我还没有尝试过,但我正面临着非常类似的挑战。我正在考虑使用Linq的附加方法。

从poco列表返回的数据中手动创建真实的实体实例。