1

ASP.NET C# での私のアプリ。私はSqlにLinqを使用しています、写真を見てください

ここに画像の説明を入力

// 5 データ テーブル :

// Unit table

     id |   name    | unit_type_id          Unit_type   
       -------------------------                    
        1 | Unit 1  |     1                     id   |  name
        2 | Unit 2  |     1                     -------------   
        3 | Unit 3  |     1                     1    |  Type 1
        4 | Unit 4  |     2                     2    |  Type 2
        5 | Unit 5  |     1                     3    |  Type 3
        6 | Unit 6  |     3     




 //Tool table                                // tool_type   table

    id  |   name    | tool_type_id              id   |  name
    ----------------------------            ------------------- 
    1   |   Tool 1  |     1                     1    |  Tool_type 1
    2   |   Tool 2  |     2                     2    |  Tool_type 2
    3   |   Tool 3  |     1                     3    |  Tool_type 3
    4   |   Tool 4  |     2         
    5   |   Tool 5  |     3 

//unit_tool テーブル

unit_id | tool_id
    ---------------
    1   |    1
    2   |    1
    1   |    2
    1   |    3
    2   |    2
    2   |    3
    3   |    3
    3   |    2

C# で linq to sql を使用して次のようなデータを取得したい

// 取得したいテーブルデータ

Unit name  |  Unit type name  | Tool name
-------------------------------------------------
Unit 1     | Type 1           | tool 1, tool 2, tool 3
Unit 2     | Type 1           | tool 1, tool 2, tool 3
Unit 3     | Type 1           | tool 2, tool 3
Unit 4     | Type 2           | 
Unit 5     | Type 1           | 
Unit 6     | Type 3           | 

私のコードは低くなります

// 新しいクラスを作成

public class unit_list
    {
        //Unit name
        public string unit_name { get; set; }
        // Unit type name
        public string unit_type_name { get; set; }
        // Tool name
        public string tool_name { get; set; }
    }

// 関数はデータを取得します

protected void show_unit()
{
    // Create datacontext
    for_testDataContext db = new for_testDataContext();
    //Query data
    IQueryable<unit_list> CourseList = from cl in db.units
                                        select new unit_list()
                                        {
                                            unit_name = cl.name,
                                            unit_type_name = cl.unit_type.name,
                                            tool_name = // how to get data like "tool1, tool 2, tool 3"
                                        };

}
4

2 に答える 2

2

このようなものを書くことができるはずです (すべての関係が Linq で正しく設定されていると仮定します):

select new unit_list()
{
    unit_name = cl.name,
    unit_type_name = cl.unit_type.name,
    tool_name = string.Join(", ", 
        cl.unit_tools.Select(ut => ut.tool.name).ToArray()
    )
};

言い換えると..

  1. unit_toolsとの 1 対多の関係を取得します
  2. ツールで対応する行を選択し、名前列を選択します
  3. 結合して単一のコンマ区切り文字列を取得する
于 2012-06-21T04:00:41.587 に答える
2

外部キーが設定されていないため、マップされたエンティティで自動的に「ナビゲーション プロパティ」が取得されません。データベースを更新してからマッピングを再生成するか、ツールボックスを使用して自分で追加する必要があります。

編集:

では、非常に短いチェックリストを実行してみましょう。

  1. 主キーと外部キーが設定され、スキーマ (データベース) に適切に関連付けられていますか? これは、sqlmetal 実行可能ファイルがオブジェクト コンテキストを生成するために使用するものであるため、重要です。
  2. モデル内の関連付けは、親エンティティと子エンティティの正しいプロパティを指していますか? これを確認するには、モデル ビューアで 2 つのオブジェクト間の関連付けをクリックし、Properties ペインを展開します。Childおよびプロパティを展開Parentし、それらが空でないことを確認します。

ここまでの手順をすべて正しく行った場合、 と の間の関連付けをクリックすると、Unit_ToolというプロパティUnitが表示されます。ChildUnits

関連付けがない場合は、次の方法で追加できます。

  1. AssociationのツールをクリックしToolboxます。
  2. キーを定義するオブジェクトをクリックします。
  3. 外部キーを保持するオブジェクトをクリックします。

これにより、一目瞭然のダイアログ ボックスが表示されます。

HTH。

編集:

これは、既存のコードをいじって解決しました (アップロードしていただきありがとうございます)。問題は非常に単純ですが、明確ではありません。各テーブルに識別子列が必要です。そうしないと、Linq-to-SQL がデータ コンテキストで子コレクション参照を作成しません。したがって、unit_tool各行に一意の ID を持たないピボット テーブル (完全に受け入れられる) として使用しているため、「ナビゲーション プロパティ」は得られません。これを修正するには、主キー フィールド (実際に使用する必要はありません。ORM のためだけです) をunit_toolテーブルに追加し、エンティティ マッピングを再作成してください、クエリはそのまま機能します。

私は言わなければなりません、これは一見したところ明らかではありませんでした。私はいつも習慣から一意の識別子を作成しているので、この問題は一度もありません...

于 2012-06-21T04:04:16.673 に答える