在我正在进行的项目中,我需要以下列方式访问LINQ中的2个数据库:
我得到了DB1指定日期范围之间所有旅行号码的列表,并将其存储为“长”值列表
我在DB2上执行了大量连接的扩展查询,但只查看了上面列表中包含其行程编号的行程。
问题是,来自DB1的旅行列表经常返回超过2100项 - 我当然在SQL中达到2100参数限制,这导致我的第二个查询失败。我一直在寻找解决这个问题的方法,例如描述here,但是这实际上将我的查询更改为LINQ-to-Objects,这会导致我的连接出现很多问题
我还能做其他解决方法吗?
答案 0 :(得分:5)
因为LINQ-to-SQL可以调用存储过程,你可以
或者自己将所有值上传到临时表并加入该表。
然而,也许您应该重新考虑这个问题:
答案 1 :(得分: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列,但你应该能够定义你想要的任何列类型(只要你有一个主键)。
答案 2 :(得分:1)
您可以拆分查询或使用填充了database1结果的database2中的临时表。