Position テーブルと関連する Team テーブルがあり、ExecuteQuery() 呼び出しから、Position エンティティのリストと関連テーブルから Team 名を取得する必要があるとします。次のように:
var list = dc.ExecuteQuery<T>("SELECT Position.*, Team.Name AS TeamName " +
"FROM Position LEFT JOIN Team ON Position.TeamID=Team.TeamID");
(実際のクエリは非常に複雑なので、ExecuteQuery() を使用する必要があります。)
はい、Position クラスのすべてのフィールドに teamname フィールドを加えた新しいフラット クラスを作成できますが、結果セットは POCO だけでなく、実際の LINQ エンティティである必要があります。これらのレコードを繰り返し処理し、いくつかのフィールドを更新するからです。 .
最初のアイデア、位置と新しいフィールドを含む新しいクラスを作成します
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");
これにより、チーム名は正しくマップされますが、ポジション オブジェクトはマップされません。
2 番目のアイデアは、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 テーブルの一部ではないため、クエリで返されないためです。
これらのアイデアのいずれかに対する回避策、またはより良いアイデアはありますか?