हल करने की कोशिश में:लिंक में अस्थायी सारणी - किसी को भी इस में कोई समस्या दिखाई देती है?
Linq .Contains with large set causes TDS error
मुझे लगता है कि मैं एक समाधान भर में ठोकर खाई है, और मैं अगर यह समस्या आ के एक कोषेर तरीका है देखना चाहते हैं।
(लघु सारांश) मैं SQL आईडी में उत्पन्न (पूरी तरह से या कम से कम आसानी से) रिकॉर्ड आईडी की सूची के खिलाफ linq-join करना चाहता हूं। यह एक बड़ी सूची है और अक्सर टीडीएस आरपीसी कॉल के लिए 2100 आइटम सीमा से पहले उड़ाती है। तो मैंने एसक्यूएल में जो किया होगा उसे एक अस्थायी तालिका में फेंक दिया जाता है, और फिर जब मुझे उनकी आवश्यकता होती है तो उसके खिलाफ शामिल हो जाती है।
तो मैंने लिंक में भी ऐसा ही किया।
मेरी 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 और नियमित रूप से SqlCommands मिश्रण (जहां एक/लेखन पढ़ने और इसलिए है अन्य है) खतरनाक हो सकता है। टेबल पर सम्मिलित करने के लिए हमेशा SqlCommands का उपयोग करके, और फिर इसे पढ़ने के लिए लिंक कमांड ठीक काम करता है। जाहिर है, लिंक कैश के परिणाम - शायद इसके चारों ओर एक रास्ता है, लेकिन यह स्पष्ट नहीं था।
ईमानदार होने के लिए, मैंने अस्थायी तालिकाओं का उपयोग करके प्रदान किए गए समाधान का परीक्षण नहीं किया है। कहा जा रहा है, समाधान निश्चित रूप से "स्थायी" टेबल का उपयोग कर काम करेगा। इसके अतिरिक्त, मैं DataContext.ExecuteCommand() विधि का उपयोग कर रहा हूं क्योंकि SQL कथन को LINQ इंजन द्वारा बिल्कुल नियंत्रित नहीं किया जाता है ... जो आप भेजते हैं वह है जो चल रहा है। –