避免在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的结果。