我反对用LINQ2SQL墙跑起来。 我喜欢它,它的惊人的灵活性,但我对有趣挂断跑起来。 我希望它只是我缺乏的是知识,而真的是一个解决方案。 举个例子......一个LINQ2SQL查询是这样的:
// IDS的一些地方集合
var terminalID = new List<int>(){1, 2, 3, 4, 5};
//一个LINQ声明的一部分:
queryDataIDs.Where(q => q.DataEventKeyID == 2 && terminalID.Contains((int)q.ValueDecimal));
会导致错误@运行
"NotSupportedException was unhandled"
"Queries with local collections are not supported"
堆:
at System.Data.Linq.SqlClient.SqlBinder.Visitor.ConvertToFetchedSequence(SqlNode node)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitAlias(SqlAlias a)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource source)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitAlias(SqlAlias a)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlVisitor.VisitSource(SqlSource source)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlVisitor.VisitSequence(SqlSelect sel)
at System.Data.Linq.SqlClient.SqlVisitor.VisitExists(SqlSubSelect sqlExpr)
at System.Data.Linq.SqlClient.SqlVisitor.VisitSubSelect(SqlSubSelect ss)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSubSelect(SqlSubSelect ss)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitBinaryOperator(SqlBinary bo)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitExpression(SqlExpression expr)
at System.Data.Linq.SqlClient.SqlBinder.Visitor.VisitSelect(SqlSelect select)
at System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node)
我究竟做错了什么? 谷歌/冰不会报这么多的解决方案,但似乎直截了当。
这不是解决方案 - 这是行不通的。 同样的错误。
围绕LinqToSQls工作“与本地集合的查询,不支持”异常
对不起球员,我确实发现问题出在哪里了。 从查询的问题wasnt我上面贴的,而是它在一个查询查询的一部分使用它是从我的。 例如。 这种查询是让我,我需要ID列表。 我用的是下面这个样子:
where queryDataIDs.Select(x => x.ID).Contains(dataEvent.DataEventID)
但是,它会错误上。 我试图让它在查询#2我的WHERE语句中做一个子查询。
如果我不喜欢这样写道:
where queryDataIDs.ToList().Select(x => x.ID).Contains(dataEvent.DataEventID)
没有问题。 但这个问题是,它变成一个查询分为两个查询(在SQL Server级别)。 性能很好,因为它在一个连接处理,但我希望能得到一个很好的单个查询针对其运行。
所以,我张贴的错误代码的一部分道歉。 这似乎LINQ2SQL不能创建一个子查询像我特林做,但那是一个小小的挫折。
我无法重现您的问题。 我与对象实例化试过一次,看看是否有你的Linq语法问题,但工作。 所以,我创建了一个SQL表:TestQueryData(DataEventKeyID:INT(PK),ValueDecimal:小数(5,3))
然后我创建了一个LinqToSql dbml的这个类/表,您的代码仍然产生了结果。 我改变了布尔和另一个Where语句,它仍然在这两种情况下工作。
/* // This all works
IQueryable<QueryData> queryDataIDs = new QueryData[]{
new QueryData{DataEventKeyID = 1, ValueDecimal = 2.2m },
new QueryData{DataEventKeyID = 2, ValueDecimal = 2.3m },
new QueryData{DataEventKeyID = 3, ValueDecimal = 2.4m },
new QueryData{DataEventKeyID = 4, ValueDecimal = 2.5m },
new QueryData{DataEventKeyID = 5, ValueDecimal = 2.6m },
new QueryData{DataEventKeyID = 6, ValueDecimal = 2.7m },
new QueryData{DataEventKeyID = 7, ValueDecimal = 2.8m },
new QueryData{DataEventKeyID = 8, ValueDecimal = 2.9m }
}.AsQueryable();
// some local collection of ids
var terminalID = new List<int>(){1, 2, 3, 4, 5};
// a part of a Linq statement:
var selectedValues = queryDataIDs
.Where(q => q.DataEventKeyID == 2)
.Where(q => terminalID.Contains((int)q.ValueDecimal)); */
TestQueryDataDataContext db = new TestQueryDataDataContext();
IQueryable<TestQueryData> queryDataIDs = db.TestQueryDatas;
var terminalID = new List<int>() { 1, 2, 3, 4, 5 };
var selectedValues = queryDataIDs
.Where(q => q.DataEventKeyID == 2)
.Where(q => terminalID.Contains((int)q.ValueDecimal));
我假设你的名单是INTS的泛型列表,因为它不会在您的文章显示。 另外,如果你的数据库表允许空值ValueDecimal,你必须检查,试图强制转换为int之前。
编辑:看起来像你想查询queryDataIDs,那是什么? 你想查询DataContextInstance.LinqToSqlCollection
var myResults = (
from q in DataContextInstance.LinqToSqlCollection
where q.DataEventKey == 2 && terminalID.Contains((int)q.ValueDecimal)
select q);
或者如果你只是想ID的,将其更改为选择q.DataEventKey而不是选择Q
你的问题是,你正在试图做一个SQL查询,包括“动态”的局部变量。 事实是,LINQ2SQL不能让这样的查询:
select * from table
where id in (--list of ids here referenced from a local variable--)
首先,你应该从你的数据库表中收集您的列表:
IQueryable<int> terminalID = db.terminals.where(p=>p.id<=5).select(x=>x.id);
然后继续你的查询:
queryDataIDs.Where(q => q.DataEventKeyID == 2 && terminalID.Contains((int)q.ValueDecimal));
希望能帮助到你
文章来源: Linq2Sql -> Searching the database against a local collection of values - “Queries with local collections are not supported”