MVC 4 / Entity Framework中的自定义查询?
我目前有一个使用ASP.net MVC 4和entity framework构建的工作CRUD应用程序。 我对表使用EDMX模型,这些模型部署在实时服务器上的数据库中。
我想知道如何查询控制器中的表以返回一个视图,该视图包含来自每个表(连接)的列,作为一个表,基于从查询字符串返回的列标题
这些是我的表,我在他们各自的模型中为他们设置了getter和setter,模型是“Model1.edmx”
AccCompany AccControl ID ID Code ControlCode CompanyID Nominal AccountsCompany CostCentre Company Department
我只是不明白如何使用自定义方法连接表,作为MVC框架。 EF似乎自己做了一切 – 就实际查询而言……
我喜欢两种方法。
第一个是直接的,使用entity framework中的导航方法:
控制器:
public ActionResult Details(short id = 0) { AccCompany accComp = db.AccCompany.Find(id); if (accComp == null) { return HttpNotFound(); } return View(accComp); }
视图:
@model Some.Entities.AccCompany @Html.DisplayNameFor(model => model.Company) @Html.DisplayFor(model => model.Company) @Html.DisplayNameFor(model => model.AccControl.CostCentre) @Html.DisplayFor(model => model.AccControl.CostCentre)
第二个涉及为特定视图创建自定义“视图模型”,并在视图中将其用作模型,更好地用于validationimo:
SomeViewModel.cs:
public class SomeViewModel { [Required] public string Company { get; set; } [Required] [Display(Name = "Cost Centre")] public string CostCentre { get; set; } }
然后在控制器中填充:
public ActionResult Details(short id = 0) { AccCompany accComp = db.AccCompany.Find(id); if (accComp == null) { return HttpNotFound(); } SomeViewModel vm = new SomeViewModel(); vm.Company = accComp.Comany; vm.CostCentre = accComp.AccControl.CostCentre; return View(vm); }
那么观点:
@model Some.SomeViewModel @Html.DisplayNameFor(model => model.Company) @Html.DisplayFor(model => model.Company) @Html.DisplayNameFor(model => model.CostCentre) @Html.DisplayFor(model => model.CostCentre)
希望这可以帮助
如果我理解你的问题,那就是你需要的
var views = from company in context.AccCompany join control in context.AccControl on company.Code equals control.ControlCode where company.Code == Request.QueryString["Code"] select new JoinedView { CompanyId: company.CompanyID, Code: company.Code, ControlId: controlId, Nominal: control.Nominal // any other columns you need }
其中JoinedView是一个包含两个实体的列的类。
如果您了解Linq,则无需为自定义查询编写更多代码。
public ApiEntities Content = new ApiEntities(); public IQueryable GetCustomQuery (System.Linq.Expressions.Expression> where) where T : EntityObject { return Content.CreateObjectSet ().Where(where); }
运用
var R = new Repo(); //Single query R.GetCustomQuery(x => x.Code == Request.QueryString["Code"]).FirstOrDefault(); //list query R.GetCustomQuery (x => x.Code == Request.QueryString["Code"]).ToList();