Trong cố gắng để giải quyết:Các bảng tạm thời trong LINQ - Bất kỳ ai cũng thấy có vấn đề với điều này?
Linq .Contains with large set causes TDS error
Tôi nghĩ rằng tôi đã tình cờ một giải pháp, và tôi muốn để xem nếu nó là một cách kosher tiếp cận vấn đề.
(tóm tắt ngắn) Tôi muốn linq-join chống lại danh sách các id hồ sơ không phải là (hoàn toàn hoặc ít nhất là dễ dàng) được tạo trong SQL. Đó là một danh sách lớn và thường xuyên vượt quá giới hạn mục 2100 cho cuộc gọi TPC RPC. Vì vậy, những gì tôi đã làm trong SQL được ném chúng trong một bảng tạm thời, và sau đó tham gia chống lại điều đó khi tôi cần chúng.
Vì vậy, tôi đã làm như vậy trong Linq.
Trong file MyDB.dbml của tôi, tôi nói thêm:
<Table Name="#temptab" Member="TempTabs">
<Type Name="TempTab">
<Column Name="recno" Type="System.Int32" DbType="Int NOT NULL"
IsPrimaryKey="true" CanBeNull="false" />
</Type>
</Table>
Mở nhà thiết kế và đóng nó thêm các mục cần thiết ở đó, mặc dù cho đầy đủ, tôi sẽ trích dẫn từ tập tin 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));
}
}
}
Sau đó, nó đơn giản trở thành vấn đề xung quanh một số thứ trong mã. Nơi tôi thường có:
MyDBDataContext mydb = new MyDBDataContext();
Tôi phải chia sẻ kết nối của nó với SqlConnection bình thường để tôi có thể sử dụng kết nối để tạo bảng tạm thời. Sau đó nó có vẻ khá hữu dụng.
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();
Và sử dụng nó:
// 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;
Có ai thấy một vấn đề với cách tiếp cận này là một giải pháp có mục đích chung cho việc sử dụng bảng tạm thời trong tham gia trong LINQ?
Nó giải quyết vấn đề của tôi một cách tuyệt vời, vì bây giờ tôi có thể làm một việc đơn giản tham gia vào LINQ thay vì phải sử dụng .Contains().
Postscript: Một vấn đề mà tôi có là trộn Linq và SqlCommands thông thường trên bàn (nơi đọc/ghi và thứ khác) có thể nguy hiểm. Luôn sử dụng SqlCommands để chèn vào bảng, và sau đó các lệnh LINQ để đọc nó hoạt động tốt. Rõ ràng, Linq lưu trữ kết quả - có thể có một cách xung quanh nó, nhưng nó không phải là hiển nhiên.
Thành thật mà nói, tôi chưa thử nghiệm giải pháp mà tôi đã cung cấp bằng các bảng tạm thời. Điều đó đang được nói, giải pháp chắc chắn sẽ làm việc bằng cách sử dụng bảng "vĩnh viễn". Ngoài ra, lý do tôi đang sử dụng phương thức DataContext.ExecuteCommand() là vì câu lệnh SQL không được xử lý bởi động cơ LINQ ... những gì bạn gửi là những gì được chạy. –