2016-10-29 6 views
1

1:nの関係を持つ2つのSQLデータベーステーブルがあります。私のASP.NET MVCソリューションでは、EFコードの最初の移行を有効にし、適切なDBContextとクラスを確立しました。MVCコントローラでLinqと2つのテーブルを結合する方法

ビューに表示する特定のレコードを選択するために、両方のテーブルを結合するMVCコントローラを作成したいと思います。

 public class Tbl_Group_Communities : Entity 
{ 
    public string GKZ { get; set; } 
    public int G_ID { get; set; } 
} 

    public class Katastralgemeinden : Entity 
{ 
    public string KGNr { get; set; } 
    public string KGName { get; set; } 
    public string GKZ { get; set; } 
    public string GemeindeName { get; set; } 
} 

は、これまでのところ、私は自分自身で、テーブルの作業コントローラーを思い付くことができていたが参加していません。ここで

は、2つのクラスです。最初のクラスのためのワーキングコントローラの下:私は考えて

  public IEnumerable<Tbl_Group_Communities> Get() 
    { 
     var entities = UnitOfWork.GetAll<Tbl_Group_Communities>().ToList(); 
     return entities; 
    } 

、参加はLINQので行うことができますが、私はどのように/どこから始めれば見当がつかない。 両方のテーブルの共通キーはGKZです。参加はGKZ経由で確立する必要があります。そして、G_ID =一定の値を持つ結合レコードから特定のレコードを選択する必要があります。

誰かが私に助けを与えることができれば、とても感謝しています。 Manu

+1

私は誰かと確信しています参加方法を教えてもらえますが、[コードの最初の関係]を構成する方法を研究することをお勧めします(http://www.entityframeworktutorial.net/code-first/configure-one-to-man y-relationship-in-code-first.aspx)。ナビゲーションプロパティを持つ適切なモデルをセットアップすれば、それはかなりシンプルです。 ViewModelsを調べることをお勧めします。 –

+0

あなたは 'Join'ステートメントの記述方法に関するドキュメンテーションを見つけることができないのですか?それとは別に、 'UnitOfWork'が何を生成できるかははっきりしていません。 'Katastralgemeinden'も提供していますか?もしそうなら、 'GetAll'は何を返しますか?もしそれが 'IEnumerable'なら、結合は全く効率的ではありません。 –

+0

私はドキュメンテーションを見つけることができましたが、C#とMVC-コントローラでかなり新しいので、ドキュメンタスは助けてくれるよりも混乱していました。 UnitOfWorkはKatastralgemeindenも提供します。私はGetAllがすべてのレコードを返すと思っていました。これは、コントローラーが動作する1つのテーブルに対してチェックが行われたことだけです。何がIEnumerableより効率的でしょうか? – Manu

答えて

1

以下のように内部結合を行うことができます。

仮定:は、あなたのテーブル名はクラス名と言い換える同じ名前.IN Tbl_Group_CommunitiesKatastralgemeindenのようなものを願っています。

from s in db.Tbl_Group_Communities 
join sa in db.Katastralgemeinden on s.GKZ equals sa.GKZ 
where s.G_ID == 1 
select s 

あなたはここにjoinについての詳細を学ぶことができます。Join Operators

0

私はそれを考え出した - ここで働く私のコントローラである:

using System.Linq; 
using System.Web.Http; 
using System.Web.Http.OData.Query; 
using IndireKat.Data.Contracts; 
using IndireKat.Data.Contracts.Entities; 
using IndireKat.Shared.Framework.Security; 

namespace Presentation.Host.Controllers 
{ 
    public class KatastralgemeindenController : BaseODataController 
    { 
     private readonly IIdentityStorage identityStorage; 

     public KatastralgemeindenController(IUnitOfWork unitOfWork, IIdentityStorage identityStorage) 
     { 
      UnitOfWork = unitOfWork; 
      this.identityStorage = identityStorage; 
     } 

     [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)] 
     public IQueryable<Katastralgemeinden> Get() 
     { 
      IIndireKatPrincipal indireKatPrincipal = identityStorage.GetPrincipal(); 

      var comunityIds = UnitOfWork.GetAll<UserGroup>() 
       .Where(group => group.Id == indireKatPrincipal.GroupId) 
       .SelectMany(group => group.Tbl_Group_Communities).Select(comunity => comunity.GKZ).ToList(); 

      IQueryable<Katastralgemeinden> result = null; 

      if (comunityIds.Any()) 
      { 
       result = UnitOfWork.GetAll<Katastralgemeinden>().Where(company => comunityIds.Contains(company.GKZ)); 
      } 

      return result; 
     } 
    } 
} 

よろしく、マヌ

関連する問題