1

我有两张桌子。我的主表叫Student,副表是Marks。Dapper 对我来说是新的。

这是我的代码:

s_id是表中的主键,是Student表中的外键Marks(学生(父)-标记(子))。

控制器:加入

public ActionResult Index()
{
    string sql ="SELECT TOP 10 * FROM Student AS A INNER JOIN Mark AS B ON A.S_ID = B.S_ID";

    using (SqlConnection connection = new SqlConnection(connectionstring))
    {
        var studentDictionary = new Dictionary<int,Student>();
        var list = connection.Query<Student,Marks,Student>
             (
                 sql,(student, marks) =>
                  {
                      Student Entry;

                      if (!studentDictionary.TryGetValue(student.S_ID,out Entry))
                      {
                          Entry = student;
                          Entry.Marks = new List<Marks>();
                          studentDictionary.Add(Entry.S_ID, Entry);
                      }

                      Entry.Marks.Add(marks);

                      return Entry;
                  },
                splitOn:"S_ID")
               .Distinct()
               .ToList();
                ViewBag.list = list;
    }  

    return View();
}

结果.cs

加入模型

public class Result
{
    public string S_Name { get; set; } //student.cs
    public string S_LName { get; set; } //students.cs
    public int Score { get; set; }       //marks.cs
    public string Status { get; set; }   //marks.cs
}

如何使用 result.cs 类访问学生和标记表列?它只访问学生列为什么标记表列不访问视图侧?

我该如何解决这个问题?

看法:

@model IEnumerable<Dapper2Join.Models.Result>
@{
    @foreach (var per in ViewBag.list)
    {
        <tr>
            <td>@per.S_Name</td>
            <td>@per.S_LName</td>
            <td>@per.Score</td>
            <td>@per.Status</td>
        </tr>
    }
4

1 回答 1

1

默认情况下,Dapper 映射适用于约定。您希望您的Result类作为查询的输出,仅包含选定的列。你犯了两个错误。

  1. 您不必要地返回两个表中的所有列。相反,您可以简单地询问您需要的列。更改您的 SQL 查询如下所示:

    string sql ="SELECT TOP 10 Student.S_Name, ... Marks.Score, .... FROM Student INNER JOIN Mark ON Student.S_ID = Mark.S_ID";
    

    请注意,我不知道您表中的列名。如果与您的属性名称不匹配,您可能需要使用列别名。有关更多信息,请参阅底部的链接。

  2. 您正在映射StudentMarks类,结果由Query. 相反,您可以直接映射您想要的类;即ResultQuery 将您的呼叫更改为如下所示:

    var list = connection.Query<Result>(sql, .....);
    

除了默认行为,Dapper 还在映射方面提供了更多的灵活性和功能。有关使用 Dapper 进行映射的更多详细信息,请参阅 两个答案。

于 2019-06-12T06:21:35.983 回答