1

我目前有一个使用 ASP.net MVC 4 和实体框架构建的工作 CRUD 应用程序。我对表使用 EDMX 模型,这些表部署在实时服务器上的数据库中。

我想知道如何查询我的控制器中的表以返回一个视图,该视图包含每个表(连接)中的列,作为一个表,基于从查询字符串返回的列标题

这些是我的表,我在它们各自的模型中有获取器和设置器,模型是“Model1.edmx”

AccCompany                             AccControl
    ID                                     ID
    Code                                   ControlCode
    CompanyID                              Nominal
    AccountsCompany                        CostCentre
    Company                                Department

我只是不明白如何使用自定义方法加入表格,作为 MVC 框架。EF 似乎自己做所有事情 - 就实际查询而言......

4

3 回答 3

2

如果我正确理解您的问题,那就是您所需要的

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 是一个包含来自两个实体的列的类。

于 2013-02-07T11:40:53.337 回答
1

我喜欢两种方法。

第一个是直接的,使用实体框架中的导航方法:

控制器:

public ActionResult Details(short id = 0)
{
    AccCompany accComp = db.AccCompany.Find(id);
    if (accComp == null)
    {
        return HttpNotFound();
    }
    return View(accComp);
}

看法:

@model Some.Entities.AccCompany

<div class="displayLabel">
     @Html.DisplayNameFor(model => model.Company)
</div>
<div class="displayField">
    @Html.DisplayFor(model => model.Company)
</div>

<div class="displayLabel">
     @Html.DisplayNameFor(model => model.AccControl.CostCentre)
</div>
<div class="displayField">
    @Html.DisplayFor(model => model.AccControl.CostCentre)
</div>

第二个涉及为特定视图创建自定义“视图模型”并将其用作视图中的模型,更好地进行验证:

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

<div class="displayLabel">
     @Html.DisplayNameFor(model => model.Company)
</div>
<div class="displayField">
    @Html.DisplayFor(model => model.Company)
</div>

<div class="displayLabel">
     @Html.DisplayNameFor(model => model.CostCentre)
</div>
<div class="displayField">
    @Html.DisplayFor(model => model.CostCentre)
</div>

希望这可以帮助

于 2013-02-07T11:56:00.347 回答
0

如果您了解 Linq,则无需为自定义查询编写更多代码。

public ApiEntities Content = new ApiEntities();
public IQueryable<T> GetCustomQuery<T>(System.Linq.Expressions.Expression<Func<T, bool>> where) where T : EntityObject
{
   return Content.CreateObjectSet<T>().Where(where);
}

使用

var R = new Repo();
//Single query
R.GetCustomQuery<AccCompany>(x => x.Code == Request.QueryString["Code"]).FirstOrDefault();
//list query
R.GetCustomQuery<AccCompany>(x => x.Code == Request.QueryString["Code"]).ToList();
于 2013-04-16T09:02:59.967 回答