我正在使用Entity Framework 5.0,我从模型创建了我的数据库。以下是edmx图的屏幕截图。
我正在努力建立以下数据结构:
在给定的客户端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
标题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转换)