Последовательность не содержит элементов Linq-to-Sql - PullRequest
0 голосов
/ 08 августа 2011

У меня очень странная проблема в этом простом запросе linq

return (from doc in db.umDocumentActions
                    where doc.sysDocument.ModuleID == modid
                    join roleaction in db.umRoleActions on doc.DocumentActionID equals roleaction.DocumentActionID
                    where roleaction.RoleID == roleID
                    select new { doc.DocumentID, roleaction.RoleID }).Count() > 0;

При вызове этого запроса он выдает недопустимое исключение операции, сообщающее, что последовательность не содержит элементов.Это происходит, когда на сайте достаточно трафика.Я использую следующий статический метод, чтобы получить экземпляр datacontext.

public static EvoletDataContext Get() 
        {
            var connection = ProfiledDbConnection.Get(new SqlConnection(ConfigurationManager.ConnectionStrings["cnstring"].ToString()));

            return new EvoletDataContext(connection);
            //return DataContextUtils.CreateDataContext<EvoletDataContext>(connection);
        }

Я боюсь, что этот метод создает проблему, так как статические методы не являются потокобезопасными.Есть мнения?

1 Ответ

1 голос
/ 08 августа 2011

Моим лучшим предположением будет то, что 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();
...