如何通过传递参数来查询LIST?

时间:2017-10-05 19:38:28

标签: c# sql entity-framework linq

我正在使用Entity Framework 5.0,我从模型创建了我的数据库。以下是edmx图的屏幕截图。

enter image description here

我正在努力建立以下数据结构:

在给定的客户端ID上,给我一个属于该ClientID及其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及其给定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);
    }
}

然后获取每个标题的报告列表,这就是我被困的地方---&gt;

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

不是通过首先通过客户端获取标头然后通过标头ID获取报告来分离它,是否可以将它组合在一个方法中?抱歉这个令人困惑的解释,但我是LINQ Query的新手,所以请理解。

以下是UI实现的理想结构:

客户ID = 2

标题1

  • TReportName
  • URL

标题2

  • TReportName
  • URL

2 个答案:

答案 0 :(得分:2)

  

可以将它组合成一种方法吗?

如果我理解正确,这就是你要找的东西:

function testFunc!(values, values2, n)
    values.a .= values.a .* values2;
    for i = 1:n
        values.a2 .= values.a;
    end
end

请注意,要实现此目的,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

答案 1 :(得分: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转换)