1

我正在尝试学习实体框架。我很高兴我从查询中返回的结果为我提供了我需要的数据,但我发现我正在使用分配的 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<> 的错误。

如何清理此代码的任何提示和指示都会很棒 - 在此先感谢!

根据要求添加了实体对象的图像:

实体图像

4

1 回答 1

1

我不确定我是否正确阅读并理解了所有内容(对我来说真的很难阅读:)),但您可以尝试以下解决方案:

public static List<dto> StateNameLeadCodes(string stateName)
{
    return (from uc in repository.UserClients
            join lc in repository.LeadClients
                on uc.LeadCode equals lc.GroupCode
            where uc.StatementName == stateName
            select new dto
            {
                clientCode = uc.LeadCode,
                clientName = lc.ClientName,
                totalDebt = lc.Matters
                    .Sum(m => m.Invoices
                        .Sum(i => i.debt_Fee + i.debt_Costs + i.debt_VAT))
            }).ToList();
}

如果 LeadClient 的 Matter 集合或 Matter 的 Invoices 集合为空,则可能会出现问题,因为 EF 无法将空集合的总和具体化为一个decimal值。可能有必要使用类似的东西

totalDebt = lc.Matters
    .Sum(m => m.Invoices
        .Sum(i => (decimal?)(i.debt_Fee + i.debt_Costs + i.debt_VAT)) ?? 0m)
于 2012-10-08T22:38:43.860 回答