Это 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 можно объединить вместе?
в какой строке произошла ошибка? Я думаю, что проблема связана с вашим запросом соединения при назначении 'result'. –
Да, это правильно, ошибка при назначении результата. Я не могу понять это. –
Вы пытаетесь присоединиться к объекту базы данных с коллекциями, хранящимися в памяти, которые вызывают NotSupportedException. Попробуйте удалить метод 'ToList()' из объявления 'userNames' перед оператором' Select', поскольку EF может ссылаться только на объединение, если параметр типа IEnumerable является любым примитивным типом (например, 'int'), но вы можете использовать' IQueryable' для Сделай так. –