Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何通过传递参数查询列表?_C#_Sql_Entity Framework_Linq - Fatal编程技术网

C# 如何通过传递参数查询列表?

C# 如何通过传递参数查询列表?,c#,sql,entity-framework,linq,C#,Sql,Entity Framework,Linq,我使用的是EntityFramework5.0,我从模型中创建了数据库。下面是edmx图表的屏幕截图 我正在努力实现以下数据结构: 在给定的客户ID上,为我提供属于该客户ID的订单列表及其三端口,因此我对我的模型进行了如下建模: public class TReportHeaderModel { public int ID { get; set; } public int ClientID { get; set; } public string THeaderTitl

我使用的是EntityFramework5.0,我从模型中创建了数据库。下面是edmx图表的屏幕截图

我正在努力实现以下数据结构:

在给定的客户ID上,为我提供属于该客户ID的订单列表及其三端口,因此我对我的模型进行了如下建模:

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; }
}
然后得到每个标题的报告列表,这就是我被卡住的地方-->

public IList GetChildReportsByHeader(int THeaderID)
{
使用(var connection=new treportentiesconnection())
{
// ....
}
}
与其先按客户机获取标题,然后按标题id获取报告来将其分离,还可以将其组合到一个方法中吗?很抱歉让人费解,但我是LINQ Query的新手,请理解

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

客户端ID=2

标题1

  • TReportName
  • 网址
标题2

  • TReportName
  • 网址
有没有可能用一种方法把它结合起来

如果我理解正确,这就是你想要的:

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

有没有可能用一种方法把它结合起来

如果我理解正确,这就是你想要的:

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

通常,我建议您将获取数据和将数据转换为DTO的方法分开,如下所示(我通常在类级别定义连接,而不是在方法级别,因为我将多次重用连接,并且我更喜欢尽可能延迟数据访问):

然后我将创建如下扩展方法:

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());
  }
}
如果您不希望在模块级别建立连接,这也很容易:

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

(或者使用并跳过所有手动Dto转换)

通常,我建议您将获取数据和将数据转换为Dto的方法分开,如下所示(我通常在类级别定义连接,而不是在方法级别,因为我将多次重用连接,并且我更喜欢尽可能延迟数据访问):

然后我将创建如下扩展方法:

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());
  }
}
如果您不希望在模块级别建立连接,这也很容易:

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

(或者使用并跳过所有手动Dto转换)

在这种情况下,我将如何返回模型?
clientHeaders
List
,因此您可以返回它。这将生成
TReportHeaderModel
包含
TReportModel
s,因此我认为这是您的“理想结构”.因为我有这个方法,我真的不需要方法“GetChildReportsByHeader,对吗?返回clientHeaders.ToList();以这种方式返回是否正确?第一个或第二个
ToList
都是不必要的,但是是的。在这种情况下,我应该如何返回模型?
clientHeaders
List
以便您可以返回它。这会生成
TReportHeaderModel
包含
TReportModel
s,因此我认为这就是您的“理想结构”。因为我有这个方法,我真的不需要方法“GetChildReportsByHeader,对吗?返回clientHeaders.ToList();这样返回正确吗?好吧,第一个或第二个
ToList
都是不必要的,但是是的。
using(var connection = new TReportEntitiesConnection())
{
  var result=connection.THeaders.ByClientId(200).ToDto();
}