任何人都看到这个问题?
在试图解决:
Linq。包含大集合导致TDS错误
我想我已经偶然发现了一个解决方案,我想看看这是否是解决问题的一种更好的方法。
(简短摘要)我想要linq-join与SQL中没有(完全或至少容易)生成的记录ID列表进行比较。 这是一个很大的清单,经常会超过TDS RPC调用的2100项限制。 所以我在SQL中做了什么就把它们放在临时表中,然后在需要时加入它。
所以我在Linq也是这样做的。
在我的MyDB.dbml文件中我添加了:
<Table Name="#temptab" Member="TempTabs">
<Type Name="TempTab">
<Column Name="recno" Type="System.Int32" DbType="Int NOT NULL"
IsPrimaryKey="true" CanBeNull="false" />
</Type>
</Table>
打开设计器并关闭它添加了必要的条目,但为了完整起见,我将引用MyDB.desginer.cs文件:
[Table(Name="#temptab")]
public partial class TempTab : INotifyPropertyChanging, INotifyPropertyChanged
{
private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty);
private int _recno;
#region Extensibility Method Definitions
partial void OnLoaded();
partial void OnValidate(System.Data.Linq.ChangeAction action);
partial void OnCreated();
partial void OnrecnoChanging(int value);
partial void OnrecnoChanged();
#endregion
public TempTab()
{
OnCreated();
}
[Column(Storage="_recno", DbType="Int NOT NULL", IsPrimaryKey=true)]
public int recno
{
get
{
return this._recno;
}
set
{
if ((this._recno != value))
{
this.OnrecnoChanging(value);
this.SendPropertyChanging();
this._recno = value;
this.SendPropertyChanged("recno");
this.OnrecnoChanged();
}
}
}
public event PropertyChangingEventHandler PropertyChanging;
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void SendPropertyChanging()
{
if ((this.PropertyChanging != null))
{
this.PropertyChanging(this, emptyChangingEventArgs);
}
}
protected virtual void SendPropertyChanged(String propertyName)
{
if ((this.PropertyChanged != null))
{
this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
然后它就成了一个在代码中围绕一些东西的问题。 我通常会有的地方:
MyDBDataContext mydb = new MyDBDataContext();
我必须让它与普通的SqlConnection共享它的连接,以便我可以使用连接来创建临时表。 之后,它似乎很有用。
string connstring = "Data Source.... etc..";
SqlConnection conn = new SqlConnection(connstring);
conn.Open();
SqlCommand cmd = new SqlCommand("create table #temptab " +
"(recno int primary key not null)", conn);
cmd.ExecuteNonQuery();
MyDBDataContext mydb = new MyDBDataContext(conn);
// Now insert some records (1 shown for example)
TempTab tt = new TempTab();
tt.recno = 1;
mydb.TempTabs.InsertOnSubmit(tt);
mydb.SubmitChanges();
并使用它:
// Through normal SqlCommands, etc...
cmd = new SqlCommand("select top 1 * from #temptab", conn);
Object o = cmd.ExecuteScalar();
// Or through Linq
var t = from tx in mydb.TempTabs
from v in mydb.v_BigTables
where tx.recno == v.recno
select tx;
有没有人看到这种方法的问题,作为在Linq中使用临时表的通用解决方案?
它很好地解决了我的问题,因为现在我可以直接在Linq中进行连接,而不必使用.Contains()。
后记 :我所遇到的一个问题是,混合Linq和普通SqlCommands在表上(其中一个在读/写,另一个在另一个)可能是危险的。 总是使用SqlCommands在表上插入,然后用Linq命令来读取它。 显然,Linq缓存结果 - 可能有一种解决方法,但它并不明显。
我没有看到使用临时表来解决问题的问题。 就混合SqlCommands和LINQ而言,你对危险因素绝对正确。 使用DataContext执行SQL语句非常简单,我甚至不用担心SqlCommand:
private string _ConnectionString = "<your connection string>";
public void CreateTempTable()
{
using (MyDBDataContext dc = new MyDBDataContext(_ConnectionString))
{
dc.ExecuteCommand("create table #temptab (recno int primary key not null)");
}
}
public void DropTempTable()
{
using (MyDBDataContext dc = new MyDBDataContext(_ConnectionString))
{
dc.ExecuteCommand("DROP TABLE #TEMPTAB");
}
}
public void YourMethod()
{
CreateTempTable();
using (MyDBDataContext dc = new MyDBDataContext(_ConnectionString))
{
...
... do whatever you want (within reason)
...
}
DropTempTable();
}
我们也有类似的情况,虽然这起作用,但问题变成了你并没有真正处理Queryable,所以你不能轻易使用这个“与”LINQ。 这不是一个适用于方法链的解决方案。
我们的最终解决方案就是在存储过程中抛出我们想要的东西,并在我们需要这些值时将临时表中的选择写入临时表中。 这是一种妥协,但都是解决方法。 至少在存储过程中,设计人员将为您生成调用代码,并且您有一个黑盒子实现,所以如果您需要进一步调整,您可以严格按照过程执行操作,而无需重新编译。
在一个完美的世界中,将来会有一些编程Linq2Sql语句的支持,这些语句允许您在查询中使用临时表,避免在这种复杂场景中使用令人讨厌的SQL IN语句。
作为“通用解决方案”,如果您的代码在多个线程/应用程序中运行,该怎么办? 我认为大清单解决方案总是与问题领域相关。 对您正在处理的问题使用常规表格更好。
我曾经在数据库中创建了一个“通用”列表。 该表由三列创建:int,uniqueidentifier和varchar,以及用于管理每个列表的其他列。 我在想:“它应该足以处理很多案件”。 但很快我收到一个任务,要求使用三个整数列表执行一个连接。 之后,我再也没有尝试过创建“通用”列表。
另外,最好创建一个SP,将多个项目插入到每个数据库调用的列表中。 您可以在少于2分贝的往返中轻松插入〜2000个物品。 原因,取决于你在做什么,表现可能并不重要。
编辑:忘了它是一个临时表和临时表是每个连接,所以我以前的多线程参数是不正确的。 但是,对于执行固定模式,这不是一个通用的解决方案。
链接地址: http://www.djcxy.com/p/42747.html上一篇: Anyone see a problem with this?
下一篇: How do ADO.NET DataTable Constraints affect performance?