Models.Student' 不包含 'Score' 的定义
Models.Student' does not contain a definition for 'Score'
我有两个 table。我的主要 table 叫 Student
,次要 table 叫 Marks
。 Dapper 对我来说是新的。
这是我的代码:
s_id
是 Student
table 中的主键并且是 Marks
table 中的外键(学生 (parent) – 标记(child)).
控制器:加入
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 class 访问学生和标记 table 的列?它仅访问学生列,为什么标记 table 列未访问视图端?
我该如何解决这个问题?
查看:
@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>
}
默认情况下,Dapper 映射遵循约定。您希望 Result
class 作为仅包含选定列的查询的输出。你犯了两个错误。
您不必要地返回两个 table 中的所有列。相反,您可以简单地询问您需要的列。更改您的 SQL 查询 something 如下:
string sql ="SELECT TOP 10 Student.S_Name, ... Marks.Score, .... FROM Student INNER JOIN Mark ON Student.S_ID = Mark.S_ID";
请注意,我不知道您 table 中的列名称。如果与您的 属性 名称不匹配,您可能需要使用列别名。请参阅底部的链接以获取更多信息。
您正在将 Student
和 Marks
class 映射到 Query
返回的结果。相反,你可以直接映射你想要的class;即 Result
。将您的通话更改为 Query
某事,如下所示:
var list = connection.Query<Result>(sql, .....);
除了默认行为外,Dapper 还在映射方面提供了更多的灵活性和功能。有关使用 Dapper 进行映射的更多详细信息,请参阅 two 个答案。
我有两个 table。我的主要 table 叫 Student
,次要 table 叫 Marks
。 Dapper 对我来说是新的。
这是我的代码:
s_id
是 Student
table 中的主键并且是 Marks
table 中的外键(学生 (parent) – 标记(child)).
控制器:加入
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 class 访问学生和标记 table 的列?它仅访问学生列,为什么标记 table 列未访问视图端?
我该如何解决这个问题?
查看:
@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>
}
默认情况下,Dapper 映射遵循约定。您希望 Result
class 作为仅包含选定列的查询的输出。你犯了两个错误。
您不必要地返回两个 table 中的所有列。相反,您可以简单地询问您需要的列。更改您的 SQL 查询 something 如下:
string sql ="SELECT TOP 10 Student.S_Name, ... Marks.Score, .... FROM Student INNER JOIN Mark ON Student.S_ID = Mark.S_ID";
请注意,我不知道您 table 中的列名称。如果与您的 属性 名称不匹配,您可能需要使用列别名。请参阅底部的链接以获取更多信息。
您正在将
Student
和Marks
class 映射到Query
返回的结果。相反,你可以直接映射你想要的class;即Result
。将您的通话更改为Query
某事,如下所示:var list = connection.Query<Result>(sql, .....);
除了默认行为外,Dapper 还在映射方面提供了更多的灵活性和功能。有关使用 Dapper 进行映射的更多详细信息,请参阅