Sequence不包含Linq-to-Sql元素

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Sequence不包含Linq-to-Sql元素相关的知识,希望对你有一定的参考价值。

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

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

答案

我最好的猜测是,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();

以上是关于Sequence不包含Linq-to-Sql元素的主要内容,如果未能解决你的问题,请参考以下文章

Sequence包含多个匹配元素

具有多个包含的Linq-to-Sql

Linq-to-sql 不产生多个外连接?

CodeForces 224C Bracket Sequence(栈)

匹配所有不包含子元素或者文本的空元素

Python 基于csv 读取文本文件提示:‘gbk‘ codec can‘t decode byte 0xbf in position 2: illegal multibyte sequence(代