C# 如何通过传递参数查询列表?
我使用的是EntityFramework5.0,我从模型中创建了数据库。下面是edmx图表的屏幕截图 我正在努力实现以下数据结构: 在给定的客户ID上,为我提供属于该客户ID的订单列表及其三端口,因此我对我的模型进行了如下建模: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
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
- 网址
- 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();
}