Я пытаюсь проверить, имеет ли сущность в базе данных какие-либо отношения внешних ключей, чтобы я мог сообщить пользователю, что объект может или не может быть удален.Запросить запрос на анонимный словарь <string,int>
Я понимаю, что это можно сделать в откатной транзакции, однако я хотел бы сообщить пользователю, сколько ссылок и где они должны помочь в их решении удалить объект.
Я стараюсь не загружать всю коллекцию навигации в память, чтобы получить эти данные, поскольку они могут быть большими. Таким образом, в свете этого, я могу сформулировать этот простой запрос, чтобы во-первых, определить, имеются ли какие-либо ссылки:
private bool CanDeleteComponent(int compId)
{
var query = _Context.Components.Where(c => c.ComponentID == compId)
.Select(comp => new
{
References = comp.Incidents.Any() &&
comp.Drawings.Any() &&
comp.Documents.Any() &&
comp.Tasks.Any() &&
comp.Images.Any() &&
comp.Instructions.Any()
});
var result = query.FirstOrDefault();
if (result != null)
{
return !result.References;
}
return true;
}
Это выполняет ряд SELECT COUNT(*) FROM <TABLE> WHERE...
запросов.
Теперь я хотел бы предоставить дополнительную информацию о количестве ссылок. В идеале я хотел бы вернуть словарь с указанным именем данных и связанным счетчиком. Таким образом, я могу перебирать результат, а не обращаться к отдельным свойствам анонимного типа. Тем не менее, то, что я пытался результаты в виде исключения:
var query = _Context.Components.Where(c => c.ComponentID == compId)
.Select(comp => new Dictionary<string, int>
{
{"Events", comp.Incidents.Count()},
{"Drawings", comp.Drawings.Count()},
{"Documents", comp.Documents.Count()},
{"Tasks", comp.Tasks.Count()},
{"Images", comp.Images.Count()},
{"Instructions", comp.Instructions.Count()},
});
var result = query.FirstOrDefault();
return query.Any(fk => fk.Value > 0);
Исключения, которое возникает в:
A first chance exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll
Additional information: Only list initializer items with a single element are supported in LINQ to Entities.
Есть ли способ обойти это, так что я могу вернуть какие-то IEnumerable, а не анонимный тип?
Благодаря
EDIT В настоящее время я ленивая загрузка отключена в моем контексте. Если есть решение без поворота на ленивую загрузку, это будет оценено по достоинству.
Спасибо, я вижу, что это сработает, если у меня LazyLoadingEnabled = true. Есть ли способ отключить его? – Simon
@Simon См. Мое редактирование. –
спасибо, но теперь это загружает все навигационные данные, которые могут быть довольно большими и интенсивными в памяти, что я и стараюсь избежать. Конечной целью является выполнение только запросов 'SELECT COUNT()' для каждой таблицы FK. – Simon