在試圖解決:Linq臨時表 - 任何人都看到這個問題?
Linq .Contains with large set causes TDS error
我想我已經跨解決方案迷迷糊糊的,我想看看它是否接近問題的猶太方式。
(簡短摘要)我想linq連接與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緩存結果 - 可能有一種解決方法,但它並不明顯。
說實話,我還沒有測試過使用臨時表提供的解決方案。這就是說,解決方案肯定會使用「永久」表。另外,我使用DataContext.ExecuteCommand()方法的原因是因爲SQL語句根本不是由LINQ引擎處理的......你發送的是被運行的東西。 – 2011-02-04 20:00:48