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元素的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 224C Bracket Sequence(栈)
Python 基于csv 读取文本文件提示:‘gbk‘ codec can‘t decode byte 0xbf in position 2: illegal multibyte sequence(代