2017-10-05 36 views
0

我正在使用实体框架5.0,并从模型创建我的数据库。以下是edmx图的截图。如何通过传递参数来查询LIST?

enter image description here

我努力的方向,以数据的结构如下:

在给定的客户端ID给我THEADER的列表,它属于该客户端ID和TReports所以我模仿我的模型如下:

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及其对给定clientID的每个报告:

我首先上市的头给定clientID的:

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分离它的首先由客户端的头部,然后通过头部标识符获取报告,是否可以将它合并到一个方法中?对于混淆的解释抱歉,但我是LINQ Query的新手,请理解。

的下面是用于UI implemetation理想结构:

客户端ID = 2

标题1

  • TReportName
  • URL

标题2

  • TReportName
  • URL

回答

2

是有可能给它的一个方法结合起来?

如果我理解正确的话,这是你在找什么:

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; 

注意,对于这项工作,TReportHeaderModel.TReports应该IEnumerable<TReportModel>

+0

在这种情况下,怎么会我返回模型? –

+0

'clientHeaders'是'List ',所以你可以返回它。这产生了包含TReportModel的'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转换)