2017-10-05 7 views
0

私はEntity Framework 5.0を使用しており、モデルからデータベースを作成しました。以下はedmxダイアグラムのスクリーンショットです。パラメータを渡してLISTをクエリする方法は?

enter image description here

私は、データの構造を下記に向けて働いています:

与えられたクライアントIDでくれそう、私は以下のように私のモデルをモデル化しているクライアントIDとそのTReportsに属しTheaderのリストを与えます

public class TReportHeaderModel 
{ 
    public int ID { get; set; } 
    public int ClientID { get; set; } 
    public string THeaderTitle { get; set; } 
    public int RowNumber { get; set; } 

    public IList<TReportModel> TReports { get; set; } 
} 

public class TReportModel 
{ 
    public int ID { get; set; } 
    public string TReportName { get; set; } 
    public string URL { get; set; } 
    public int RowNumber { get; set; } 
} 

は、だから私はTheadersを取得するために照会し、特定のクライアントIDのためにその各レポートとき:私は

public IList<TReportHeaderModel> GetHeadersByClient(int ClientID) 
{ 
    using (var connection = new TReportEntitiesConnection()) 
    { 
     var clientHeaders= (from st in connection.THeaders 
          where ClientID == st.ClientID 
          select new TReportHeaderModel 
          { 
           ID=st.ID, 
           THeaderTitle=st.THeaderTitle, 
           RowNumber=st.RowNumber 
          }).ToList(); 

     return (clientHeaders); 
    } 
} 

し、各タイトルのレポートのリストを取得するために、私は立ち往生午前場所です--->

public IList<TReportModel> GetChildReportsByHeader(int THeaderID) 
{ 
    using (var connection = new TReportEntitiesConnection()) 
    { 
     // .... 
    } 
} 

代わりにGETによってそれを分離する:与えられたクライアントIDのための最初のヘッダをリストアップ最初にクライアントがヘッダーを作成し、ヘッダーIDでレポートを取得します。これを1つの方法で組み合わせることは可能ですか?私はLINQクエリを初めて知っていますので、ご理解ください。

クライアントID = 2

ヘッダ1

  • TReportName
  • URL

ヘッダ2

以下UI実装のための理想的な構造であります

  • TReportName
  • URL

答えて

2

は、それが一つの方法でそれを組み合わせることが可能ですか?これが機能するために、TReportHeaderModel.TReportsIEnumerable<TReportModel>でなければならないこと

using (var connection = new TReportEntitiesConnection()) 
{ 
    var clientHeaders = (
     from st in connection.THeaders 
     where ClientID == st.ClientID 
     select new TReportHeaderModel 
     { 
      ID=st.ID, 
      THeaderTitle = st.THeaderTitle, 
      RowNumber = st.RowNumber, 
      Reports = from r in st.TReports 
         select new TReportModel 
         { 
         ID = r.ID, 
         TReportName = r.TReportName, 
         URL = r.URL, 
         RowNumber = r.RowNumber, 
         } 
     } 
    ).ToList(); 
} 
return clientHeaders; 

注:私が正しくあなたを理解していれば

が、これはあなたが探しているものです。

+0

、どのようにだろう私はモデルを返しますか? –

+0

'clientHeaders'は' List 'ですので、返すことができます。これは 'TReportModel'sを含む' TReportHeaderModel'を生成するので、あなたの "理想的な構造"です。 –

+0

私はこのメソッドを持っているので、実際にはメソッド 'GetChildReportsByHeader、右は必要ありませんか? –

0

通常、データを取得し、このようなデータをDTOに変換する方法を分けておくことをお勧めします(通常は、接続レベルを定義するのではなく、クラスレベルで接続を定義します。 、と私は)できるだけ怠惰なアクセス私のデータを維持することを好む:

TReportEntitiesConnection conn = new TReportEntitiesConnection(); 

その後、私はそうのような拡張メソッドを作成します:

public static class MyExtensions 
{ 
    public IQueryable<THeader> ByClientId(this IQuerable<THeader> conn, int ClientID) 
    { 
    return conn 
     .Include(h=>h.Reports) 
     .Where(h=>h.ClientID==ClientID); 
    } 
    public TReportHeaderModel ToDto(this THeader t) 
    { 
    return new TReportHeaderModel 
    { 
     ID=t.ID, 
     ClientID=t.ClientID, 
     THeaderTitle=t.THeaderTitle, 
     RowNumber=t.RowNumber, 
     Reports=t.Reports.ToDto() 
    }; 
    } 
    public TReportModel ToDto(this TReport r) 
    { 
    return new TReportModel 
    { 
     ID=r.ID, 
     TReportName=r.TReportName, 
     URL=r.URL, 
     RowNumber=r.RowNumber 
    }; 
    } 
    public IEnumerable<TReportHeaderModel> ToDto(this IEnumerable<THeader> h) 
    { 
    return h.Select(x=>x.ToDto()); 
    } 
    public IEnumerable<TReportModel> ToDto(this IEnumerable<TReport> r) 
    { 
    return r.Select(x=>x.ToDto()); 
    } 
} 

次にあなたがそうのようにそれを使用することができます:

var result=conn.THeaders.ByClientId(200).ToDto(); 

あなたはモジュールレベルでの接続を持っていないことを好む場合は、それはあまりにも簡単です。この場合は

using(var connection = new TReportEntitiesConnection()) 
{ 
    var result=connection.THeaders.ByClientId(200).ToDto(); 
} 

(またはAutoMapperを使用し、すべての手動DTO変換をスキップ)

関連する問題