2011-05-25 85 views
7

在一个项目中,我目前的工作,我需要访问2个数据库中LINQ以下方式:避免在LINQ 2100参数限制为SQL

  1. 我得到的所有行程数之间的列表指定日期范围内从DB1,并存储该为“长”列表值

  2. 我进行了广泛的查询有很多连接DB2上,但只有在看有包括在上述的行程数之旅名单。

问题是,DB1的旅程列表经常返回超过2100项 - 我当然在SQL中遇到了2100参数限制,导致我的第二个查询失败。我一直在寻找解决这个办法,如描述here,但是这基本上改变了我的查询LINQ到对象,这会导致很多问题,我加入

效果是否还有其他解决方法我可以?

+4

你不能返回结果集而不是2100参数吗? – 2011-05-25 09:25:25

+0

您是否考虑批量插入操作? – 2011-05-25 09:25:57

+0

在[此连接问题]中有一个解决方案使用单个XML参数(https://connect.microsoft.com/VisualStudio/feedback/details/475984/use-an-xml-type-parameter-in-order-to-超过最2100-参数限制功能于LINQ到SQL的当滤波-经由-A-本地集合)。但我同意Guillame--如果可以的话,你应该在两个数据库之间进行协调。 – Rup 2011-05-25 09:37:37

回答

5

的LINQ到SQL可以调用存储的特效,你可以

  • 有一个存储过程,它接受一个数组作为然后输入放值在一个临时表通过加入对
  • 同样以一个字符串的存储过程拆分

或者自己上传的所有值到一个临时表,并加入该表。

但是也许你应该重新考虑这个问题:

  • SQL Server可以被配置为允许对其他数据库(包括Oracle)表查询,如果你被允许,这可能是一个选择。
  • 您可以使用一些复制系统来保存DB2中更新旅行号的表吗?
+0

谢谢,临时表的想法是太棒了,完美的作品。我唯一担心的是并发用户同时使用系统可能会导致问题,尽管我有一个想法将用户的用户名与旅行号一起存储在临时表中 – Chris 2011-05-25 12:31:57

+0

@chris,“本地临时表只在当前可见会话“,因为每个Ado.Net连接都有不同的会话,您应该可以使用”本地临时表“。 – 2011-05-25 12:48:01

1

您可以拆分您的查询或使用database1中的临时表填充来自database1的结果。

2

不确定这是否会有所帮助,但是我在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, 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列,但你应该能够定义任何列(S)输入您希望,(只要你有一个主键)。