Существует ли LINQPad, эквивалентный классу DataContext?

Я только начал использовать LINQPad, и пока он мне нравится, но в большинстве руководств по LINQ TO SQL, с которыми я сталкивался, используется класс DataContext, который создается Visual Studio для постоянных обновлений и т. д. Я также довольно новичок в LINQ TO SQL. поэтому мой вопрос в том, что эквивалентно следующему в LINQPad (если он есть)...

MyDbDataContext db = new MyDbDataContext();

...

db.SubmitChanges();

person Nick Allen    schedule 12.05.2009    source источник
comment
Класс, в который сгенерирован ваш код, является частью сгенерированного DataContext для выбранной базы данных. Если вам нужно обратиться к контексту вашего кода LINQPad, используйте это. Примечание. LINQPad не создает контекст точно так же, как это делает LINQ to SQL, поэтому некоторые пограничные случаи могут работать в LINQPad не так, как в LINQ to Sql.   -  person Jim Wooley    schedule 30.08.2011


Ответы (6)


Краткий ответ: вам не нужно создавать DataContext самостоятельно. LINQPad поставляется с множеством примеров, взгляните на них.

Когда вы подключаете LINQPad к базе данных, он создает для вас DataContext. Таблицы DataContext (Table<T>) и SubmitChanges() доступны как локальные члены.

Например, в стандартном режиме LINQPad "C# Expression" вы можете просто написать:

from p in Person
where p.Name == "Joe"
select p.Address

В режиме LINQPad «Выражение C#»:

var query = from p in Person
            where p.Name == "Joe"
            select p.Address;

query.Dump(); // Dump() shows results below

Person joe = query.First();
joe.Name = "Peter";
SubmitChanges();

joe.Dump(); // shows joe's values under the previous query results

Метод расширения LINQPad Dump() очень полезен, его можно вызвать для любого объекта или коллекции (в режиме операторов LINQPad), чтобы показать результаты ниже.

Обратите внимание, что вам даже не нужно подключаться к базе данных, чтобы использовать LINQPad. Вы можете работать с коллекциями в памяти:

int[] numbers = new[] { 1, 2, 3, 4, 5 };
numbers.Where(n => n > 3).Select(n => n * 2).Dump();

На самом деле вам даже не нужно использовать LINQ для использования LINQPad. Он также отлично работает как компилятор фрагментов.

person Lucas    schedule 12.05.2009
comment
Как насчет вставки новых записей с помощью LINQ to SQL и LINQPad? Я попытался вставить, вызвав InsertOnSubmit() для таблицы TEntity в моей базе данных со столбцом идентификатора, и я получил исключение Столбец не может быть изменен. Идентификатор никогда не был указан. - person Jeff LaFay; 27.05.2011
comment
@jlafay, вероятно, уже давно решен, но, возможно, в вашем TEntity не установлен первичный ключ. - person Eric Wu; 29.01.2016

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

Вы можете загрузить свой собственный DataContext из сборки, если хотите. Независимо от того, загружаете ли вы свой собственный контекст или позволяете LinqPad создать его для вас, вы работаете в контексте класса «UserQuery», созданного LinqPad.

Следующий оператор C# показывает это:

  this.GetType().Name.Dump();  // Shows UserQuery

Этот класс UserQuery является производным от DataContext. В этом примере я позволил Linqpad создать контекст данных для базы данных AdventureWorks:

  this.GetType().BaseType.Dump();  // Shows TypedDataContext

Если я загружаю свой собственный DataContext с именем MyDataContext:

  this.GetType().BaseType.Dump();  // Shows MyDataContext
person drs9222    schedule 24.07.2009
comment
Помогли мне понять, что мне нужно передать в конструкторе класса, чтобы иметь возможность выполнять запросы в этой области. public class SubClass { public SubClass(TypedDataContext db) { db.Users.Where(x => x.IsActive); } } и создать его с помощью new SubClass(this); - person Thymine; 27.07.2018

Как упоминалось ранее, вам не нужно создавать DataContext, так как LINQPad создает его по умолчанию.
Но на всякий случай вам нужен второй DataContext (для той же базы данных), который вы можете использовать

var secondDataContext = new UserQuery();

Это создаст второй контекст данных точно так же, как автоматически созданный.

person jaraics    schedule 04.05.2011
comment
Спасибо! Это то, что необходимо для копирования и вставки запросов из Visual Studio в linqpad только с этим небольшим изменением, иначе придется удалить контекст БД! - person Lyubomir Velchev; 29.11.2016

Основываясь на ответе jaraics, я обнаружил, что конструктору UserQuery требуется строка подключения. По крайней мере, для LINQPad версии 4.37.11. Поэтому я извлек строку подключения из экземпляра UserQuery, созданного LINQPad, и использовал ее для создания собственного экземпляра.

var connectionString = this.Connection.ConnectionString;
var secondDataContext = new UserQuery(connectionString);

Когда я использовал приведенный выше код, он дал мне второй DataContext.

person Andrew    schedule 05.03.2012
comment
FWIW, это больше не работает (по крайней мере, с 4.42.01), так как ctor теперь вместо этого принимает параметр IDbConnection, так что теперь вы можете просто сделать var secondDataContext = new UserQuery(this.Connection); - person James Manning; 02.08.2012
comment
Используя LINQPad 5, я применил совет Эндрю следующим образом: using (var dc = new PulseDataContext(this.Connection.ConnectionString)) { /* ваш код обновления/вставки здесь */ dc.SaveChanges(); } - person CAK2; 09.02.2019

Согласно комментарию @Thymine к ответу @DRS9222, вы можете просто использовать что-то вроде:

void Main()
{
    TypedDataContext db = this;

    var qry = from i in db.Items
        select i;
    // etc. etc.
}

Это становится довольно переносимым между LinqPad и вашей IDE, вместо того, чтобы исправлять или удалять контекст.

person stvo    schedule 02.07.2020

Я могу получить доступ к следующему образцу всякий раз, когда добавляю статический метод вне основной части:

using(var VT = new LINQPad.User.TypedDataContext())
  return (from g in VT.GM_MEMBERS  where g.Username == username select new { g.Password }).FirstOrDefault()?.Password;
person HGMamaci    schedule 02.03.2017