Временные таблицы в Linq — Кто-либо видит проблему с этим?

В попытке решить:

Linq.Contains с большим набором вызывает ошибку TDS

Я думаю, что споткнулся через решение, и я хотел бы видеть - ли это кошерный способ приблизиться к проблеме.

(краткое изложение), к которому я хотел бы linq-присоединиться против списка рекордного идентификатора, которые не являются (полностью или по крайней мере легко) сгенерированы в SQL. Это - большой список и часто дует мимо предела объекта 2100 года для вызова RPC TDS. Таким образом, то, что я сделал бы в SQL, бросают их во временной таблице и затем присоединяются против этого, когда мне были нужны они.

Таким образом, я сделал то же в Linq.

В моем файле MyDB.dbml я добавил:


    
  

Открытие разработчик и закрытие его добавил необходимые записи там, хотя для полноты, я заключу в кавычки из файла 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 - существуют, вероятно, путь вокруг этого, но это не был obviousl.

7
задан Joel Coehoorn 17 September 2009 в 22:53
поделиться