Models.Student 'не содержит определения для' Score ' - PullRequest
1 голос
/ 12 июня 2019

У меня есть две таблицы. Моя основная таблица называется 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();
}

Result.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>
    }

1 Ответ

1 голос
/ 12 июня 2019

По умолчанию сопоставления 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. Вы отображаете Student и Marks классы с результатом, возвращаемым Query.Вместо этого вы можете напрямую отобразить нужный класс;то есть Result.Измените ваш вызов на Query что-то , как показано ниже:

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

Помимо поведения по умолчанию, Dapper также обеспечивает большую гибкость и функции в отображении.Для получения более подробной информации о сопоставлении с Dapper см. эти два ответа.

...