我正在尝试学习实体框架。我很高兴我从查询中返回的结果为我提供了我需要的数据,但我发现我正在使用分配的 for-each 循环和单独的数据库请求来获取我需要的信息。
如果有人可以查看我的代码并建议是否有一种方法可以使事情更简洁,并且如果我没有真正获得实体框架提供的功能,我将不胜感激(我想我在某处错过了这一点! !)。这里的任何方式都是问题和代码(我希望这是有道理的):
尝试从我的数据库中的 4 个表中查询。一个是不相关的(由于我的懒惰 - 我需要修改它,但目前它不是一个交易破坏者)。其他 3 个与 1 对多关系相关。这是一个摘要:
UserClients - 不相关的表(应该链接到 LeadClient 但不重要)
[LeadClient PK = GroupCode] 一对多对 [Matters FK = LeadCode] [Matters PK = MatterNumber] 一对多对 [Invoices FK = Matter]
我正在尝试创建一个 DTO 对象列表来填充 GridView。我的 DTO 如下:
public class dto
{
public string clientCode { get; set; }
public string clientName { get; set; }
public decimal totalDebt { get; set; }
}
我将 statementName 变量传递给一个方法,然后我查询 UserClients 以获取客户端代码列表。
这是我填充 List 对象的方法:
public static List<dto> StateNameLeadCodes(string stateName)
{
//DTO objects
List<dto> items = new List<dto>();
//Leadcode list for statement name
List<string> leadcodes = (from o in repository.UserClients where o.StatementName == stateName select o.LeadCode).ToList();
//From leadcodes populate items list
foreach(string s in leadcodes)
{
//Get clientCode and matter list for the client code
var code = (from o in repository.LeadClients where o.GroupCode == s select new { o.ClientName, o.Matters}).First();
dto temp = new dto();
temp.clientCode = s;
temp.clientName = code.ClientName;
//Get a list if invoices for each matter
foreach (Matter m in code.Matters)
{
List<Invoice> invoices = (from o in repository.Invoices where o.Matter == m.Matternumber select o).ToList();
//Calculate total debt for all invoices
foreach (Invoice inv in invoices)
{
temp.totalDebt += (inv.debt_Fee + inv.debt_Costs + inv.debt_VAT);
}
}
items.Add(temp);
}
return items;
}
当我想将单个项目和列表的组合返回到 DTO 时,我发现自己在做类似的事情。我看到我的 Entity 类有一个 EntityCollection 用于一对多关系。我试图选择实体对象作为我的选择语句的一部分,但我收到 EnitityCollection 无法转换为 List<> 的错误。
如何清理此代码的任何提示和指示都会很棒 - 在此先感谢!
根据要求添加了实体对象的图像: