EF6:如何在列表中搜索项目



我有一个简单的ASP.Net MVC应用程序,带有Entity Framework 6。

我有两个表:一个是"联系人"列表(包括姓名、地址和电话号码(,另一个表为每个联系人记录零个或多个"Notes"历史记录:

型号/联系人:

public class Contact
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ContactId { get; set; }
public string Name { get; set; }
public string EMail { get; set; }
public string Phone1 { get; set; }
...
public virtual List<Note> Notes { get; set; }
}

型号/注释.cs:

public class Note
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int NoteId { get; set; }
public string Text { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime? Date { get; set; }
[ForeignKey("Contact")]
public int ContactId { get; set; }
public virtual Contact Contact { get; set; }
}

我在Visual Studio中做了一个"添加控制器",它自动生成了"ContactsController.cs"one_answers"Index.cshtml"、"Details.cs.html"、"Edit.c.html"one_answers"Delete.cs.html"的视图。所有自动生成的代码看起来都很好,运行也很好。但它没有显示任何"备注"。

我可以显示"注释",并通过在"Details.cs.html"one_answers"Edit.cs.html"中添加以下内容来添加编辑或删除注释的链接:

视图/联系人/编辑.cs.html:

@model ContactsApp.Models.Contact
...
<h4>Notes</h4>
<table class="table">
<tr>
<th>Date</th>
<th>Note</th>
<th>&nbsp;</th>
</tr>
@for (int i = 0; i < Model.Notes.Count(); i++)
{
<tr>
<td>@Html.DisplayFor(model => model.Notes[i].Date)</td>
<td>@Html.DisplayFor(model => model.Notes[i].Text)</td>
<td>
@Html.ActionLink("Edit Note", "EditNote", new { noteId = Model.Notes[i].NoteId }) |
@Html.ActionLink("Delete Note", "DeleteNote", new { noteId = Model.Notes[i].NoteId })
</td>
</tr>
}
</table>

我还创建了一个"EditNote.cs.html"视图。。。但我一直不知道如何从ContactsController:调用它

控制器/触点Controller.cs:

// GET: Contacts/EditNote?noteId=3
public async Task<ActionResult> EditNote(int? noteId)
{
if (noteId == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Note note = await db.Contacts.Where(c => c.Notes.noteId == noteId);
if (note == null)
{
return HttpNotFound();
}
return View(note);
}

问:获取"Note"并将其传递到"EditNote"视图的正确ASP.Net MV语法是什么

由于以下行,您的代码不应该正常编译:

Note note = await db.Contacts.Where(c => c.Notes.noteId == noteId);

右侧表达式的类型为IEnumerable<Contact>,而您为其指定的变量的类型则为Note。应更改为以下内容:

Note note = await db.Notes.FirstOrDefaultAsync(note => note.NodeId == noteId);

顺便说一句:Where是一个同步调用,所以不需要使用await关键字。

您正在返回一个联系人。

您应该查询笔记并使用FirstOrDefault。

db.Notes.Where(n=> n.NoteId =id).FirstOrDefault();

如果你想通过id和note id从联系人中进行选择以提高效率,请尝试使用LINQ,在另一个对象列表中选择对象列表

最新更新