2016-11-11 173 views
3

这是需要转换为LINQ查询的SQL查询。将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) 
        }; 

返回结果中的最后查询给出错误: “无法创建类型为‘匿名类型’的恒定值而已。原始类型或枚举类型在此上下文中受支持。“

有没有其他更好的方式来实现这一点,所有不同的LINQ查询可以结合在一起?

+0

在这行中出现的错误?我认为这个问题与分配'result'时的连接查询有关。 –

+0

是的,这是正确的错误是当分配结果..我无法弄清楚.. –

+0

你试图加入数据库对象与存储在内存中引发NotSupportedException的集合。因为如果IEnumerable类型参数是任何基本类型(例如'int'),EF只能引用连接,但可以使用'IQueryable'来尝试在'Select'语句之前从'userNames'声明中移除'ToList这样做。 –

回答

1

检查整个查询结构之后,我发现了另外两个join来源除了listPLDQueueIEnumerable集合与匿名类型参数,其中实体框架只能用原始的类型时进行连接操作请参见IEnumerable类型参数或IQueryable

尝试放置或评论都ToList()方法来分配IQueryable两个indexSummaryuserNames,然后考虑给予适当的类名称,而不是使用匿名类型是这样的:

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>),它们适合在包含join查询的result赋值中使用它们。

相关问题&引用:

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