【发布时间】:2017-10-10 06:04:00
【问题描述】:
我在尝试在 Linq 中为两个数据库表进行联接时遇到了一些错误。在我的数据库中,我有一个参与者表和一个性别表。 我有 3 个模型在使用 - Participant、Gender 和 ParticipantDetailsViewModel。 (最终我想切换其他参与者的详细信息以允许更多的数据抽象,例如城市表)。
参与者
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace MVCManageParticipants.Models
{
public class Participant
{
public int Id { get; set; }
public int SiteId { get; set; }
public int Status { get; set; }
public int Gender { get; set; }
public string Title { get; set; }
[Required]
[StringLength(35)]
public string Name { get; set; }
public string City { get; set; }
public string Postcode { get; set; }
public string Telephone { get; set; }
public string Notes { get; set; }
}
}
性别
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Web;
namespace MVCManageParticipants.Models
{
public class Gender
{
public int Id { get; set; }
public string Name { get; set; }
}
}
ParticipantDetailsViewModel
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
namespace MVCManageParticipants.Models
{
public class ParticipantDetailsViewModel
{
public int Id { get; set; }
public int SiteId { get; set; }
public int Status { get; set; }
public string Title { get; set; }
public string Gender { get; set; }
public string Name { get; set; }
public string City { get; set; }
public string Country { get; set; }
public string Postcode { get; set; }
public string Telephone { get; set; }
public string Notes { get; set; }
}
}
在我的控制器中,我有以下方法来处理详细信息页面:
public ActionResult Details([Bind(Prefix = "id")]int participantId = 0)
{
// Check participant exists
Participant participant = _db.Participants.Find(participantId);
if (participant == null)
{
return HttpNotFound();
}
var model = (from p in _db.Participants
join g in _db.Genders on p.Gender equals g.Id
where p.Id == participantId
select new ParticipantDetailsViewModel
{
Id = p.Id,
SiteId = p.SiteId,
Status = p.Status,
Gender = g.Name,
Title = p.Title,
Name = p.Name,
City = p.City,
Postcode = p.Postcode,
Telephone = p.Telephone,
Notes = p.Notes
});
return View(model);
}
当我调试应用程序时,我会从控制器返回模型并在结果视图中显示以下内容:
为了测试,我已经剥离了我的详细信息视图,以便我拥有以下内容:
@model MVCManageParticipants.Models.ParticipantDetailsViewModel
@{ ViewBag.Title = "Details"; }
<h2>Details2</h2>
@Model.Id
@Model.Gender
我收到以下错误:
传入字典的模型项的类型为“System.Data.Entity.Infrastructure.DbQuery`1[MVCManageParticipants.Models.ParticipantDetailsViewModel]”,但此字典需要“MVCManageParticipants.Models”类型的模型项.ParticipantDetailsViewModel'。
不知道问题是什么以及如何解决它。
【问题讨论】:
-
model在您的情况下是一个 LINQ 查询,它可能导致多个实体,而您的视图只需要一个对象作为模型。试试return View(model.FirstOrDefault);。 -
只是一个小笔记。当 EF 专门设计用于帮助您自动执行联接时,我不断看到人们手动执行联接;你可以在你的
Participant上有public Gender Gender {get;set;},如果上下文配置正确,你可以访问它,EF 会在幕后为你加入。因此,在投影中,您可以只使用Gender = p.Gender.Name并忘记加入的所有内容。 -
@AlexPaven 您能否提供任何资源来进一步解释这一点?它仍然使用此方法,但性别字段为空。
-
@AlexPaven 表中的新列已创建,名为 Gender_ID,需要填充。感谢您的提示,这更容易更清洁!
标签: c# asp.net-mvc entity-framework linq asp.net-mvc-5