2

テーブルに結合するLINQtoSQLクエリ関数がありますが、この関数は「returnres.ToList();」でエラーを出します。

  • imo_noはintです
  • position_cordinatesは文字列です
  • essel_idはintです
  • 装備はストリングです。

私の機能:

List<T> GetAllInitialize()
{
    PositionDataClassesDataContext context = new PositionDataClassesDataContext();

    var res = from positions in context.it_positions
              join vessels in context.it_vessels on positions.imo_no equals vessels.imo_no
              select new { positions.imo_no, positions.position_cordinates, vessels.vessel_id, vessels.equipment };

    return res.ToList();
}

ここに画像の説明を入力してください

4

3 に答える 3

1

静的型付けを使用して、匿名型または匿名型のオブジェクトのコレクションをローカルで使用できますが、静的型に関する情報を失うことなく、関数からそれらを返す方法はありません。

返されるデータを保持するための名前付きクラスを作成できない、または何らかの理由で作成したくない場合はList<dynamic>、またはを返す必要がありますList<object>。これらのアプローチには両方とも欠点があります。dynamic静的に型指定された同等のオブジェクトよりも遅くなりますが、System.Object返されるデータをあまり処理できません。

最善の解決策は、名前付きの戻りタイプを作成することです。

public class PositionData {
     public int ImoNo {get;set;}
     public string PositionCordinates {get;set;}
     public int VesselId {get;set;}
     public string Equipment  {get;set;}
}

これで、クエリは次のようになります。

select new PositionData {
    ImoNo = positions.imo_no
,   PositionCordinates = positions.position_cordinates
,   VesselId = vessels.vessel_id
,   Equipment = vessels.equipment
};

メソッドの戻り値のタイプはに変わりますList<PositionData>

于 2013-02-12T18:51:54.790 に答える
0
  1. 匿名オブジェクトが持つフィールドを表す4つのプロパティを含む新しいクラスを作成します。

  2. 匿名select型を使用するのではなく、この新しいカスタム型のインスタンスを作成するようにメソッドを変更します。

  3. メソッドの戻り型を、List<T>そのカスタム型のリストを返すから返すように変更します。

匿名オブジェクトは、それらが作成された範囲外で使用されるようには設計されていません。複数のスコープからこの型を使用する予定なので、このデータを表す新しい名前付き型を作成する必要があります。

于 2013-02-12T18:51:57.123 に答える
0

ジェネリック型引数を持つメソッドシグネチャで匿名型を返すことはできません。

あなたはできる:

  1. 戻り署名を持ってください。List<object>その場合、どのフィールドにもアクセスできません。そのため、フィールド値にアクセスするにはリフレクションが必要になります。
  2. フィールド参照のコンパイルタイプタイプチェックを返しList<dynamic>、失いますが、それらは「アクセス可能」です。
  3. クエリによって入力され、メソッドシグネチャの戻り型として指定される中間具象型を宣言します。

私の意見では、3番目のオプションが実際に唯一の実行可能な選択肢です。

于 2013-02-12T18:52:13.807 に答える