【问题标题】:EF6: How do I search for an item in a List?EF6:如何在列表中搜索项目?
【发布时间】:2020-03-13 13:22:24
【问题描述】:

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

我有两个表:一个“联系人”列表(包含姓名、地址和电话号码)和第二个表,该表记录每个联系人的零个或多个“便笺”历史记录:

模型/Contact.cs:

   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; }
    }

模型/Note.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 中做了一个“添加控制器”,它为“Index.cshtml”、“Details.cshtml”、“Edit.cshtml”和“Delete.cshtml”自动生成了“ContactsController.cs”和视图。所有自动生成的代码看起来都不错,并且运行良好。但它没有显示任何“注释”。

通过将以下内容添加到“Details.cshtml”和“Edit.cshtml”,我能够显示“注释”并添加编辑或删除注释的链接:

视图/联系人/Edit.cshtml:

@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.cshtml”视图...但我无法弄清楚如何从 ContactsController 调用它:

Controllers/ContactsController.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 语法是什么?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework-6


    【解决方案1】:

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

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

    右边表达式的类型是IEnumerable&lt;Contact&gt;,而你分配给它的变量类型是Note。这应该更改为以下内容:

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

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

    【讨论】:

    • 它没有编译。我的问题是如何获取关于“联系人”查询正确“注释”的语法。你和 Athanasios Kataras 为我指明了正确的方向:我根本不应该处理“联系人”。如果我想要一个“Note”......我应该简单地查询“Notes”表。我做到了 - 它奏效了:) 谢谢!
    【解决方案2】:

    您正在返回一个联系人。

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

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

    如果您想通过 id 和 note id 从联系人中进行选择以提高效率,请尝试Using LINQ, select list of objects inside another list of objects

    【讨论】:

    • 完美 - 谢谢。我的错误是认为我需要查询“联系人”才能找到正确的“笔记”。我什至没有在我的 DBContext 类中公开“Notes”——只有“Contacts”。事情似乎奏效了。有一阵子,直到这个问题。所以我在 DBContext 中添加了注释,我应用了你和 Christos 给我的语法 (Note note = db.Notes.FirstOrDefault(n =&gt; n.NoteId == noteId); .. 它正在工作。谢谢:)
    • 干杯 m8!很高兴我能帮上忙。
    猜你喜欢
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2014-03-14
    • 2014-04-21
    • 2015-08-31
    • 1970-01-01
    相关资源
    最近更新 更多