5

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 テーブルの一部ではないため、クエリで返されないためです。

これらのアイデアのいずれかに対する回避策、またはより良いアイデアはありますか?

4

2 に答える 2

1

より良いアイデア:

これらの場合にはDapperを使用してください:)

別のアイデア:

擬似プロパティを追加します。

IOW、TeamNameプロパティをPositionクラスに追加します。の場合null、使用されていません。また、LINQ2SQL 属性で装飾しないでください。

さらに別のアイデア:

オブジェクトの変更を気にしない場合は、ビューを作成してデザイナーにドロップするだけです。必要に応じて、いくつかの追加のプロパティを追加して、実際のエンティティに解決します。

于 2011-10-25T05:01:38.983 に答える
0

私はまだこれを試していませんが、非常によく似た課題に直面しています。Linq.Table オブジェクトの Attach メソッドを使用して、POCO のリストで返されたデータから作成された真のエンティティ インスタンスを手動で設定することを検討しています。

于 2013-12-18T17:44:29.817 に答える