1

我在 ASP.NET C# 中的应用程序。我使用 Linq to Sql,看图片

在此处输入图像描述

// 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的一对多关系
  2. 在工具中选择相应的行并选择名称
  3. 加入以获取单个逗号分隔的字符串
于 2012-06-21T04:00:41.587 回答
2

您没有设置任何外键,这意味着您不会获得映射实体的自动“导航属性”。您必须更新数据库然后重新生成映射,或者使用工具箱自己添加它们。

编辑:

好的,让我们列出一个非常简短的清单。

  1. 主键和外键是否在模式(您的数据库)中正确设置和关联?这很重要,因为这是 sqlmetal 可执行文件用来生成对象上下文的内容。
  2. 模型中的关联是否指向父实体和子实体中的正确属性?您可以通过在模型查看器中单击两个对象之间的关联然后展开Properties 窗格来检查这一点。展开ChildParent属性并验证它们不为空。

如果到目前为止你做的一切都正确,点击 和 之间的关联Unit_Tool应该Unit会显示一个Child名为Units.

如果您缺少关联,可以通过以下方式添加:

  1. 单击 中的Association工具Toolbox
  2. 单击定义键的对象。
  3. 单击包含键的对象。

这将弹出一个对话框,该对话框应该是不言自明的。

HTH。

编辑:

通过使用现有代码解决了这个问题(感谢上传)。问题非常简单,但并不十分明显:您需要在每个表中都有一个标识符列,或者 Linq-to-SQL 不会在数据上下文中创建子集合引用。因此,由于您unit_tool仅将其用作数据透视表(完全可以接受),每行没有唯一 ID,因此您不会获得“导航属性”。要解决此问题,只需向表中添加一个主键字段(您不必实际使用它 - 它仅用于 ORM)unit_tool,重新创建实体映射,然后中提琴!,您的查询将按原样工作。

我不得不说,这乍一看并不明显。我从来没有遇到过这个问题,因为我总是出于习惯创建一个唯一标识符......

于 2012-06-21T04:04:16.673 回答