2011-01-27 4 views
2

Может ли кто-нибудь помочь мне сделать этот цикл запросов эффективным аналитическим запросом Linq? Я загружаю это в TreeView, поэтому каждый элемент должен быть прикреплен. Включения также очень неэффективны. Ленивая загрузка предметов также не будет работать. Как это, этот запрос попадает к базе данных много раз больше, чем он долженБолее эффективный запрос LINQ

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; 
    } 
+0

LINQ to SQL или LINQ для объектов? – Adrian

+0

LINQ to Entities. –

ответ

1
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; 

    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); 

     info.Client.Transactions.Attach(info.TransactionInfos.Select(t => t.Transaction)); 
    } 

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

Чтобы скомпилировать его, мне пришлось немного изменить синтаксис. Не очень, но я получил эту ошибку: Ошибка загрузки операции для запроса «GetTopLevelData». Этот метод не поддерживается в отношении материализованного результата запроса. –

+0

@Inturbidus: Вы, должно быть, получили эту ошибку в каком-то другом коде, который вы написали, а не в этом методе, который я написал. – Timwi

+0

Ошибка в foreach (var transactionInfo в Info.TransactionInfos) .... –

2

Для тех, кто заботится это был последний код, который работал.

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, чтобы захватить формы.

Смежные вопросы