2016-11-11 3 views
3

Это SQL-запрос, который необходимо преобразовать в запрос LINQ.Преобразование SQL-запроса в запрос LINQ

SELECT pq.DocumentQueueID, 
    pq.DocumentQueueName, 
    pq.DepartmentName, 
    pq.UserLocation, 
    ISNULL(T.DocumentCount, 0) DocCount, 
    ISNULL(CONVERT(VARCHAR(50),T.OldestDocumentDate),'') IngestionDateTime, 
    ISNULL(B.UserName, '') UserName 
FROM [dbo].[listPLDQueues] pq 
LEFT OUTER JOIN 
(
    SELECT dds.CurrentDocumentQueue, 
    SUM(dds.ImportPageCount) as DocumentCount, 
    MIN(dds.IngestionDateTime) as OldestDocumentDate 
    FROM [dbo].[dataDocumentStats] dds 
    GROUP BY dds.CurrentDocumentQueue 
) AS T ON T.CurrentDocumentQueue = pq.DocumentQueueID 
LEFT OUTER JOIN 
( SELECT duq.DocumentQueueID, UserName = 
    STUFF((SELECT ', ' + uq.UserDisplayName 
    FROM [dbo].[dataUserQueues] uq 
    WHERE uq.DocumentQueueID = duq.DocumentQueueID 
    FOR XML PATH('')),1,2,'') 
FROM [dbo].[dataUserQueues] duq 
GROUP BY duq.DocumentQueueID 
) AS B ON B.DocumentQueueID = pq.DocumentQueueID 
WHERE UPPER(WorkflowType) = 'INDEXING' 

Что я сделал до сих пор в LINQ запрос ..

var indexSummary = _eimStatsDB.listPLDQueues 
      .Join(_eimStatsDB.dataDocumentStats, 
       pld => pld.DocumentQueueID, 
       dds => dds.CurrentDocumentQueue, 
       (pld, dds) => new { pldQueues = pld, dataDocument = dds })    
      .Where(a => a.pldQueues.WorkflowType.ToLower() == "indexing") 
      .GroupBy(a => a.pldQueues.DocumentQueueID) 
      .ToList() 
      .Select(a => new 
      { 
       DocumentQueueId = a.Key, 
       DocumentQueueName = a.Select(i => i.pldQueues.DocumentQueueName).FirstOrDefault(), 
       DepartmentName = a.Select(i => i.pldQueues.DepartmentName).FirstOrDefault(), 
       DocumentCount = a.Sum(i => i.dataDocument.ImportPageCount), 
       OldestDocumentDate = a.Min(i => i.dataDocument.IngestionDateTime), 
       UserLocation = a.Select(i => i.pldQueues.UserLocation).FirstOrDefault(), 
       IsChecked = false 
      }); 

     var userNames = _eimStatsDB.dataUserQueues 
      .GroupBy(e => e.DocumentQueueID) 
      .ToList() 
      .Select(e => new 
      { 
       DocumentId = e.Key, 
       UserName = string.Join(",", e.Select(i => i.UserDisplayName)) 
      }); 

     var listPLDQueue = from pldqueue in _eimStatsDB.listPLDQueues 
          where pldqueue.WorkflowType == "Indexing" 
          select pldqueue; 

     var result = from pldqueue in listPLDQueue 
        join iS in indexSummary 
        on pldqueue.DocumentQueueID equals iS.DocumentQueueId into pldjoin 
        from pld in pldjoin.DefaultIfEmpty() 
        join un in userNames 
        on pld.DocumentQueueId equals un.DocumentId into gj 
        from subuser in gj.DefaultIfEmpty() 
        select new 
        { 
         DocumentQueueId = pld.DocumentQueueId, 
         DocumentQueueName = pld.DocumentQueueName, 
         DepartmentName = pld.DepartmentName, 
         DocumentCount = (pld.DocumentCount == null ? 0 : pld.DocumentCount), 
         OldestDocumentDate = (pld.OldestDocumentDate == null? Convert.ToDateTime(string.Empty) : pld.OldestDocumentDate), 
         UserLocation = pld.UserLocation, 
         IsChecked = pld.IsChecked, 
         Usernames = (subuser == null ? string.Empty : subuser.UserName) 
        }; 

Последний запрос, который возвращает результат дает ошибку: «Невозможно создать постоянное значение типа„типа Anonymous“Only. в этом контексте поддерживаются примитивные типы или типы перечислений ».

Есть ли другой лучший способ достичь этого, когда все различные запросы LINQ можно объединить вместе?

+0

в какой строке произошла ошибка? Я думаю, что проблема связана с вашим запросом соединения при назначении 'result'. –

+0

Да, это правильно, ошибка при назначении результата. Я не могу понять это. –

+0

Вы пытаетесь присоединиться к объекту базы данных с коллекциями, хранящимися в памяти, которые вызывают NotSupportedException. Попробуйте удалить метод 'ToList()' из объявления 'userNames' перед оператором' Select', поскольку EF может ссылаться только на объединение, если параметр типа IEnumerable является любым примитивным типом (например, 'int'), но вы можете использовать' IQueryable' для Сделай так. –

ответ

1

После изучения всей структуры запроса, я нашел два join других источников, кроме listPLDQueue является IEnumerable коллекции с анонимным параметром типа, где Entity Framework только возможность ссылаться IEnumerable с примитивным типом в качестве параметра типа или IQueryable, когда выполняет операцию соединения.

Try капельной или комментируя все ToList() метод, чтобы назначить IQueryable как для indexSummary и userNames, а затем рассмотреть вопрос о предоставлении собственного имени класса, а не с помощью анонимного типа, как это:

var indexSummary = _eimStatsDB.listPLDQueues 
      .Join(_eimStatsDB.dataDocumentStats, 
       pld => pld.DocumentQueueID, 
       dds => dds.CurrentDocumentQueue, 
       (pld, dds) => new { pldQueues = pld, dataDocument = dds })    
      .Where(a => a.pldQueues.WorkflowType.ToLower() == "indexing") 
      .GroupBy(a => a.pldQueues.DocumentQueueID) 
     //.ToList() --> this converts IQueryable to IEnumerable, which should be dropped 
      .Select(a => new listPLDQueues() // change this assignment to your model class name 
      { 
       DocumentQueueId = a.Key, 
       DocumentQueueName = a.Select(i => i.pldQueues.DocumentQueueName).FirstOrDefault(), 
       DepartmentName = a.Select(i => i.pldQueues.DepartmentName).FirstOrDefault(), 
       DocumentCount = a.Sum(i => i.dataDocument.ImportPageCount), 
       OldestDocumentDate = a.Min(i => i.dataDocument.IngestionDateTime), 
       UserLocation = a.Select(i => i.pldQueues.UserLocation).FirstOrDefault(), 
       IsChecked = false 
      }); 

var userNames = _eimStatsDB.dataUserQueues 
      .GroupBy(e => e.DocumentQueueID) 
      //.ToList() --> this converts IQueryable to IEnumerable, which should be dropped 
      .Select(e => new dataUserQueues() // change this assignment to your model class name 
      { 
       DocumentId = e.Key, 
       UserName = string.Join(",", e.Select(i => i.UserDisplayName)) 
      }); 

Каждое задание будет возвращать IQueryable<T> (T присваивается Имя класса модели DB, то есть IQueryable<listPLDQueues> и IQueryable<dataUserQueues>), которые подходят для использования в задании result, содержащем запрос join.

связанные с этим проблемы & ссылки:

Unable to create a constant value of type 'Anonymous type'. Only primitive types or enumeration types are supported in this context

Unable to create a constant value of type 'Anonymous type'. Only primitive types or enumeration types are supported in this context two db Linq query

IQueryable for Anonymous Types

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

  • Нет связанных вопросов^_^