2

「marketGroupID」(その要素の ID) と「parentGroupID」(要素の親 ID) を持つフラット テーブルのツリー関係を構築する CTE 再帰クエリを作成しようとしています。各「marketGroup」は、任意の数の子「marketGroups」などを持つことができます。

これが私の作業クエリです(Sql Server Managementでテスト済み):

    With cte As
(SELECT [marketGroupID]
      ,[parentGroupID]
      ,[marketGroupName]
      ,[description]
      ,[iconID]
      ,[hasTypes]
      , 0 As Level
  FROM [Eve_Retribution_1.0.7].[dbo].[invMarketGroups]
  WHERE [parentGroupID] IS NULL
  UNION All
  Select mg.marketGroupID
    ,mg.parentGroupID
    ,mg.marketGroupName
    ,mg.description
    ,mg.iconID
    ,mg.hasTypes
    ,c.Level + 1 As Level
  FROM [Eve_Retribution_1.0.7].dbo.invMarketGroups mg
  Inner Join cte c On mg.parentGroupID = c.marketGroupID
  WHERE mg.marketGroupID <> mg.parentGroupID
)
  SELECT marketGroupID
    ,parentGroupID
    ,marketGroupName
    ,description
    ,iconID
    ,hasTypes
    , Level
  FROM cte

このクエリは、要素を正しい順序で正しく一覧表示し、Level パラメータは、要素からツリーを構築するために使用することを意図しています。

これを C# に翻訳するのは、私が問題を抱えているところです。このデータベースを統合し、対応するすべてのテーブルがデータベースからコードに自動的に組み込まれました。次のように、C# でこのクエリを呼び出そうとします。

    EveOnlineClassesDataContext context = new EveOnlineClassesDataContext();
    IEnumerable<invMarketGroup> results = context.ExecuteQuery<invMarketGroup>
            (@"**ABOVE QUERY**");

「invMarketGroup」クラスは、O/R デザイナーによって構築された自動的に作成されたクラスです。私の問題は、テーブル自体の一部ではなく、提供されたクラスに要素がないため、各「marketGroup」のレベルパラメーターにアクセスできなくなることです。

実際の「invMarketGroup」クラス オブジェクトとそれぞれに対応するレベルをクエリから取得して、この構造を表すメモリ内のツリーを構築できるようにします。どうすればこれを行うことができますか?

ありがとう

4

1 に答える 1

1

そのクエリを使用して、データベース内にビュー を作成する方が簡単かもしれません:vwInvMarketGroup

CREATE VIEW vwInvMarketGroup AS
    With cte As
(SELECT [marketGroupID]
      ,[parentGroupID]
      ,[marketGroupName]
      ,[description]
      ,[iconID]
      ,[hasTypes]
      , 0 As Level
  FROM [Eve_Retribution_1.0.7].[dbo].[invMarketGroups]
  WHERE [parentGroupID] IS NULL
  UNION All
  Select mg.marketGroupID
    ,mg.parentGroupID
    ,mg.marketGroupName
    ,mg.description
    ,mg.iconID
    ,mg.hasTypes
    ,c.Level + 1 As Level
  FROM [Eve_Retribution_1.0.7].dbo.invMarketGroups mg
  Inner Join cte c On mg.parentGroupID = c.marketGroupID
  WHERE mg.marketGroupID <> mg.parentGroupID
)
  SELECT marketGroupID
    ,parentGroupID
    ,marketGroupName
    ,description
    ,iconID
    ,hasTypes
    , Level
  FROM cte
GO

次に、これを使用できます:

IEnumerable<invMarketGroup> results = context.ExecuteQuery<invMarketGroup>(@"SELECT * FROM vwInvMarketGroup");
于 2013-02-05T19:35:56.500 に答える