如何解决避免在LINQ中将2100参数限制为SQL
| 在当前正在进行的项目中,我需要以以下方式访问LINQ中的2个数据库: 我从DB1获得了指定日期范围内的所有行程编号的列表,并将其存储为\'long \'值的列表 我对DB2上的许多联接执行了广泛的查询,但是仅查看其旅程编号包含在上面列表中的旅程。 问题是,DB1的行程列表经常返回2100多个项目-我当然达到了sql中的2100参数限制,这导致我的第二次查询失败。我一直在研究解决此问题的方法,例如此处所述,但这实际上将我的查询更改为LINQ-to-Objects,这导致我的联接出现很多问题。 我还有其他解决方法吗?解决方法
因为LINQ-to-SQL可以调用存储的proc,所以您可以
有一个存储过程,该过程将数组作为输入,然后将值放入临时表中以联接
同样地,采用存储过程拆分的字符串
或自己将所有值上传到临时表并加入该表。
但是,也许您应该重新考虑问题:
可以将Sql Server配置为允许对其他数据库(包括oracle)中的表进行查询,如果允许的话,这可能是您的一个选择。
您可以使用某种复制系统在DB2中保持旅行编号表的更新吗?
,不确定这是否有帮助,但是我在LinqPad中编写的一次性查询遇到类似的问题,最终定义和使用了这样的临时表。
[Table(Name=\"#TmpTable1\")]
public class TmpRecord
{
[Column(DbType=\"Int\",IsPrimaryKey=true,UpdateCheck=UpdateCheck.Never)]
public int? Value { get; set; }
}
public Table<TmpRecord> TmpRecords
{
get { return base.GetTable<TmpRecord>(); }
}
public void DropTable<T>()
{
ExecuteCommand( \"DROP TABLE \" + Mapping.GetTable(typeof(T)).TableName );
}
public void CreateTable<T>()
{
ExecuteCommand(
typeof(DataContext)
.Assembly
.GetType(\"System.Data.Linq.SqlClient.SqlBuilder\")
.InvokeMember(\"GetCreateTableCommand\",BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.InvokeMethod,null,new[] { Mapping.GetTable(typeof(T)) } ) as string
);
}
用法就像
void Main()
{
List<int> ids = ....
this.Connection.Open();
// Note,if the connection is not opened here,the temporary table
// will be created but then dropped immediately.
CreateTable<TmpRecord>();
foreach(var id in ids)
TmpRecords.InsertOnSubmit( new TmpRecord() { Value = id}) ;
SubmitChanges();
var list1 = (from r in CustomerTransaction
join tt in TmpRecords on r.CustomerID equals tt.Value
where ....
select r).ToList();
DropTable<TmpRecord>();
this.Connection.Close();
}
在我的情况下,临时表只有一个int列,但是您应该能够定义所需的任何列类型(只要您有主键)。
,您可以拆分查询,也可以使用database2中的临时表填充来自database1的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。