Sequence不包含Linq-to-Sql元素

问题描述 投票:0回答:1

我在这个简单的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);
        }

我担心这种方法会产生问题,因为静态方法不是线程安全的。任何意见?

asp.net asp.net-mvc linq linq-to-sql datacontext
1个回答
1
投票

我最好的猜测是,sysDocument实际上是一个单独的表格,参考DocumentID。这通常意味着文档类中会有一个相关的sysDocuments集合,但我猜你已经在Linq to SQL设计器中将基数更改为"one to one"

当使用"one to one"基数时,Linq to SQL在幕后使用Single()方法来获取sysDocument。这意味着如果没有相关的sysDocuments,您将收到无效的操作异常。

您可以通过将Linq模型中的基数从"one to one"更改为"one to many"并使用SingleOrDefault()方法从sysDocuments集合中获取相关的sysDocument来解决此问题。

如果这听起来不太吸引人,你可以在数据库中查找哪个文档没有相关的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();
© www.soinside.com 2019 - 2024. All rights reserved.