Моим лучшим предположением будет то, что sysDocument
на самом деле является отдельной таблицей со ссылкой на DocumentID
.Обычно это означало бы, что в классе документа была бы связанная коллекция sysDocuments, но я предполагаю, что вы изменили количество элементов на "one to one"
в конструкторе Linq to SQL.
При использовании"one to one"
кардинальность, Linq to SQL использует метод Single()
за кулисами, чтобы получить sysDocument
.Это означает, что если нет связанных sysDocuments, вы получите исключение недействительной операции.
Это можно исправить, изменив количество элементов в вашей модели Linq с "one to one"
на "one to many"
и воспользовавшись методом SingleOrDefault()
чтобы получить связанный sysDocument
из коллекции sysDocuments.
Если это не звучит привлекательно, вы можете заглянуть в базу данных, чтобы найти, какой документ не имеет связанного sysDocument
, и исправить это вручную.
ОБНОВЛЕНИЕ:
Вместо того, чтобы основывать запрос на documentActions, попробуйте вместо этого основать его на таблице sysDocument.Мне пришлось угадать, как будет называться таблица, так что это может не скомпилироваться, но, надеюсь, вы поняли:
var query = from sysDocument in db.sysDocuments
where sysDocument.ModuleID == modid
let doc = sysDocument.umDocumentAction
join roleaction in db.umRoleActions on doc.DocumentActionID equals roleaction.DocumentActionID
where roleaction.RoleID == roleID
select new { doc.DocumentID, roleaction.RoleID };
//return true if there are any results (this is more efficient than Count() > 0)
return query.Any();