可以说我有一个位置表和一个相关的团队表
我需要从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类,并且所有其他返回Position的LINQ调用都会失败,因为teamname字段实际上不是Position表的一部分,因此不会在查询中返回。

有没有人对这些想法有一个变通办法,或者是一个更好的想法?

最佳答案

更好的主意:

在以下情况下使用Dapper :)

另一个想法:

添加一个伪属性。

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

还有一个主意:

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

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

10-12 00:03
查看更多