c# - 更高效的 LINQ 查询

标签 c# sql linq

有人可以帮我将此查询循环变成高效的 Linq 查询吗?我将其加载到 TreeView 中,因此必须附加每个项目。包含也非常低效。延迟加载项目也不起作用。事实上,这个查询对数据库的访问次数比应有的次数多了

    public IQueryable<Client> GetTopLevelData(Guid agentGuid, int year)
    {
        var clients = from client in ObjectContext.Clients
                      join cbc in ObjectContext.Client_Bucket_Client on client.Client_GUID equals cbc.Client_GUID
                      join acb in ObjectContext.Agent_Client_Bucket on cbc.Client_Bucket_GUID equals acb.Client_Bucket_GUID
                      where acb.Agent_GUID == agentGuid
                      select client;

        foreach (Client c in clients)
        {
            var transactions = ObjectContext.Transactions.Where(t => t.Client_GUID == c.Client_GUID && t.Year == year);
            foreach (Transaction t in transactions)
            {
                t.Forms.Attach(ObjectContext.Forms.Where(f => f.Transaction_GUID == t.Transaction_GUID && f.Year == year)); //.OrderByDescending(fo => fo.Create_Date));
            }
            c.Transactions.Attach(transactions);
        }

        return clients;
    }

最佳答案

对于那些关心的人来说,这是最终有效的代码。

 var clients =
    from client in ObjectContext.Clients
    join cbc in ObjectContext.Client_Bucket_Client on client.Client_GUID equals cbc.Client_GUID
    join acb in ObjectContext.Agent_Client_Bucket on cbc.Client_Bucket_GUID equals acb.Client_Bucket_GUID
    where acb.Agent_GUID == agentGuid
    select client;

        var clientInfos =
            from c in clients
            select new
            {
                Client = c,
                TransactionInfos = ObjectContext.Transactions
                    .Where(t => t.Client_GUID == c.Client_GUID && t.Year == year)
                    .Select(t => new
                    {
                        Transaction = t,
                        ToAttach = ObjectContext.Forms.Where(f => f.Transaction_GUID == t.Transaction_GUID && f.Year == year) //.OrderByDescending(fo => fo.Create_Date);
                    })
            };

        // Looping over this query will hit the database *once*
        foreach (var info in clientInfos)
        {
            foreach (var transactionInfo in info.TransactionInfos)
            {
                transactionInfo.Transaction.Forms.Attach(transactionInfo.ToAttach);
            }

            var tt = info.TransactionInfos.ToList(); //.Select(t => t.Transaction);

            var trans = tt.Select(t => t.Transaction);

            info.Client.Transactions.Attach(trans);
        }

        // Return a queryable object; constructing a new query from this will hit the database one more time
        return clients;

我必须枚举底部的列表才能让 Linq 编译器获取表单。

关于c# - 更高效的 LINQ 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4822284/

相关文章:

sql - 如何获取存储过程中引用的所有列的列表?

sql - 反向外键约束

c# - 如何在Unity C#脚本中使用System.Xml.Linq?

c# - Linq groupBy IGrouping 以简单/干净的方式列出 <>

c# - Linq OrderBy 对具有相同集合的对象进行分组

c# - 在 C# 正则表达式中是否有等同于\Q ...\E

php - SQL 变量插入 INSIDE mysql_query

.net - 存储库模式和抽象类的问题

c# - 是否可以配置 Azure C# 函数 DocumentDB 属性参数?

c# - .NET (C#) 应用程序插件的依赖 hell