1

私は現在、ASP.net MVC 4 と Entity Framework を使用して構築された動作中の CRUD アプリケーションを持っています。テーブルには EDMX モデルを使用しており、これらはライブ サーバー上のデータベースにデプロイされています。

クエリ文字列から返された列ヘッダーに基づいて、コントローラー内のテーブルをクエリして、各テーブル (結合) の列を含むビューを 1 つのテーブルとして返す方法を知りたい

これらは私のテーブルです。それぞれのモデルにゲッターとセッターがあり、モデルは「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

私が気に入っているアプローチは2つあります。

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>

2つ目は、特定のビュー用のカスタム「ビューモデル」を作成し、それをビュー内のモデルとして使用することで、検証に適しています。

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 に答える