Разбираюсь с LINQ'ом.
Разбирался со следующим вопросом.
Пытаюсь подключиться к базе данных и считать из нее таблицу с помощью запроса на LINQ'е.
namespace MyLinq2
{
[Table( Name = "Customers")]
public class CustomerMember
{
[Column(Name = "CompanyName")]
public string stCompanyName {get; set;}
}class Program
{
static void Main(string[] args)
{
DataContext dcConnect = new DataContext("server=192.168.40.63;Integrated security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Connect Timeout=600");
Table<CustomerMember> table = dcConnect.GetTable<CustomerMember>();
dcConnect.Log = Console.Out;
var valueType =
from t in table
select t.stCompanyName;
foreach (var v in valueType)
Console.WriteLine("Field is " + v);
Console.ReadKey();
}
}
}
Все отрабатывает хорошо. Но если мне нужна не одна колонка из строки а все, то что я должен каждую колонку описывать в классе-приемнике?!! На ADO.NET этот вопрос решался элементарно. Объявлялся объект класса DataTable и просто передавался в объект SqlDataAdapter. Всё! А тут как?
Здравствуйте, Karp_P, Вы писали:
K_P>Все отрабатывает хорошо. Но если мне нужна не одна колонка из строки а все, то что я должен каждую колонку описывать в классе-приемнике?!! На ADO.NET этот вопрос решался элементарно. Объявлялся объект класса DataTable и просто передавался в объект SqlDataAdapter. Всё! А тут как?
Смотря что Вы дальше собираетесь делать Может анонимные типы помогут?
from t in table
select new { t.stCompanyName, t.stSomeOtherProperty, t.stFoo };
Здравствуйте, Karp_P, Вы писали:
K_P>Разбираюсь с LINQ'ом. K_P>Разбирался со следующим вопросом. K_P>Пытаюсь подключиться к базе данных и считать из нее таблицу с помощью запроса на LINQ'е.
K_P>
K_P>namespace MyLinq2
K_P>{
K_P> [Table( Name = "Customers")]
K_P> public class CustomerMember
K_P> {
K_P> [Column(Name = "CompanyName")]
K_P> public string stCompanyName {get; set;}
K_P> }
K_P> class Program
K_P> {
K_P> static void Main(string[] args)
K_P> {
K_P> DataContext dcConnect = new DataContext("server=192.168.40.63;Integrated security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Connect Timeout=600");
K_P> Table<CustomerMember> table = dcConnect.GetTable<CustomerMember>();
K_P> dcConnect.Log = Console.Out;
K_P> var valueType =
K_P> from t in table
K_P> select t.stCompanyName;
K_P> foreach (var v in valueType)
K_P> Console.WriteLine("Field is " + v);
K_P> Console.ReadKey();
K_P> }
K_P> }
K_P>}
K_P>
K_P>Все отрабатывает хорошо. Но если мне нужна не одна колонка из строки а все, то что я должен каждую колонку описывать в классе-приемнике?!!
Да.
K_P>На ADO.NET этот вопрос решался элементарно. Объявлялся объект класса DataTable и просто передавался в объект SqlDataAdapter. Всё! А тут как?
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Пельмешко, Вы писали:
П>>Смотря что Вы дальше собираетесь делать Может анонимные типы помогут? П>>
П>> from t in table
П>> select new { t.stCompanyName, t.stSomeOtherProperty, t.stFoo };
П>>
L>Для этого все равно придется описать имена колонок в определении entity
Вот в том-то и дело! А если я "не знаю" структуру таблицы, не говоря уже о том, что мне может быть просто лень описывать специальный класс, описывающий все поля таблицы — этож какая работа для простого запроса таблицы целиком?!!
Здравствуйте, Karp_P, Вы писали:
L>>Для этого все равно придется описать имена колонок в определении entity
K_P>Вот в том-то и дело! А если я "не знаю" структуру таблицы, не говоря уже о том, что мне может быть просто лень описывать специальный класс, описывающий все поля таблицы — этож какая работа для простого запроса таблицы целиком?!!
Единственный случай, когда может понадобиться то, о чем вы говорите — это показ данных. Но я с трудом представляю ситуацию, когда приложение нужно только для показа, без редактирования, удаления, создания новых записей.
L>Единственный случай, когда может понадобиться то, о чем вы говорите — это показ данных. Но я с трудом представляю ситуацию, когда приложение нужно только для показа, без редактирования, удаления, создания новых записей.
Я говорю вообще про LINQ как альтернативу ADO.NET. Т.е. приложение полностью написано с использованием выражений LINQ, без использования запросов в стиле адо.нет. Или такое невозможно? А то получается таблицу запрошу чере адо, а вот обработку, изменение, добавление напишу с ЛИНКом.... Уж если использовать то одну технологию. Как это понимать?
Здравствуйте, Karp_P, Вы писали:
K_P>Я говорю вообще про LINQ как альтернативу ADO.NET. Т.е. приложение полностью написано с использованием выражений LINQ, без использования запросов в стиле адо.нет. Или такое невозможно? А то получается таблицу запрошу чере адо, а вот обработку, изменение, добавление напишу с ЛИНКом.... Уж если использовать то одну технологию. Как это понимать?
Если у вас уже есть обновление через linq, то значит все классы сущностей уже определены и значит проблемы, описанной в первом посте нет.
Здравствуйте, Lloyd, Вы писали:
L>Здравствуйте, Karp_P, Вы писали:
K_P>>Я говорю вообще про LINQ как альтернативу ADO.NET. Т.е. приложение полностью написано с использованием выражений LINQ, без использования запросов в стиле адо.нет. Или такое невозможно? А то получается таблицу запрошу чере адо, а вот обработку, изменение, добавление напишу с ЛИНКом.... Уж если использовать то одну технологию. Как это понимать?
L>Если у вас уже есть обновление через linq, то значит все классы сущностей уже определены и значит проблемы, описанной в первом посте нет.
Извиняюсь! Недопонял... Только пытаюсь разобраться с линком — опыт маааааленький....
Еще раз. Простой случай. Нужно получить таблицу целиком. Потом делать с ней что угодно локально на машине. Потом обратно закинуть на сервер. Вот для этого мне сразу нужно описать класс представляющий таблицу?!!..
По другому никак?
Я представлял так, что ЛИНК замена Адо.Нет (интеграция, типизация, и прочие удобства разработки). А вот такую простую задачу как вывод всей таблицы в объект(или какой-то его части), без предварительного описания объекта-приемника, не делает? На адо это было удобно — взял таблицу хоть полностью, хоть часть и запихнул в объект не утруждаясь описанием полей. Я, конечно, понимаю, что поля будут не типизированы, но все-таки сразу получаем проекцию.
K_P>Я представлял так, что ЛИНК замена Адо.Нет (интеграция, типизация, и прочие удобства разработки). А вот такую простую задачу как вывод всей таблицы в объект(или какой-то его части), без предварительного описания объекта-приемника, не делает? На адо это было удобно — взял таблицу хоть полностью, хоть часть и запихнул в объект не утруждаясь описанием полей. Я, конечно, понимаю, что поля будут не типизированы, но все-таки сразу получаем проекцию.
Linq вообще-то не замена ADO.NET, а замена Dataset...
Интересно, каким таким способом вы с помощью ADO берёте таблицу без описания её структуры?
Здравствуйте, Karp_P, Вы писали:
K_P>Еще раз. Простой случай. Нужно получить таблицу целиком. Потом делать с ней что угодно локально на машине. Потом обратно закинуть на сервер. Вот для этого мне сразу нужно описать класс представляющий таблицу?!!..
А почему не поручить эту работу студии? MSLinqToSQLGenerator
Здравствуйте, Slider_spb, Вы писали:
K_P>>Я представлял так, что ЛИНК замена Адо.Нет (интеграция, типизация, и прочие удобства разработки). А вот такую простую задачу как вывод всей таблицы в объект(или какой-то его части), без предварительного описания объекта-приемника, не делает? На адо это было удобно — взял таблицу хоть полностью, хоть часть и запихнул в объект не утруждаясь описанием полей. Я, конечно, понимаю, что поля будут не типизированы, но все-таки сразу получаем проекцию. S_>Linq вообще-то не замена ADO.NET, а замена Dataset... S_>Интересно, каким таким способом вы с помощью ADO берёте таблицу без описания её структуры?
Я уже писал об этом словами.
сейчас кодом:
DataTable table = new DataTable();
using (SqlConnection sqlCon = new SqlConnection(stringConnection))
{
SqlCommand sCommand = new SqlCommand("select * from Customers", sqlCon);
SqlDataAdapter sdaAdapter = new SqlDataAdapter();
sdaAdapter.Fill(table);
}
Здравствуйте, Karp_P, Вы писали:
S_>>Linq вообще-то не замена ADO.NET, а замена Dataset... S_>>Интересно, каким таким способом вы с помощью ADO берёте таблицу без описания её структуры?
K_P>Я уже писал об этом словами.
Тебе уже вроде бы написали, что де-факто в приложении будут определены эти сущности. Поэтому потребность в нетипизированных запросах (aka DataTable) — надуманная.
Здравствуйте, Lloyd, Вы писали:
K_P>>Я уже писал об этом словами.
L>Тебе уже вроде бы написали, что де-факто в приложении будут определены эти сущности. Поэтому потребность в нетипизированных запросах (aka DataTable) — надуманная.
Я тоже уже писал, что с ЛИНКом только разбираюсь и что не всё еще понимаю! Потому, ясен перец, спрашиваю у знающих! Так же я писал, что не понимаю, что значит "де-факто в приложении будут определены эти сущности"! И описал элементарную ситуацию, когда мне нужны все колонки или часть из них. У меня в приложении на АДО.НЕТ с самого начала (ПЕРВЫМ действием) выбираются строки из большой таблицы. Пускай не из всех колонок, но и то что выбирается количеством равно 10. Если запрашивать через ЛИНК, то, блин, лучше уж как есть через АДО, потому как описывать класс с десятью свойствами — это большой кусок кода и выигрыша я не заметил, кроме явной типизации . Так же я представил простенький запросик на адо когда ВСЕ это делается в 7 строк кода. И потом делай что хочешь с этой таблицей. Так же я писал, что не понимаю такого поведения ЛИНКа, если он пришел в качестве альтернативы АДО!! Вместо 7 строк кода целых 26!!! это ли улучшение?!! Вот чего я не понимаю!
P.S. Если б я разбирался в ЛИНКе, естественно, я бы не писал на форум! Как вы считаете?!
Здравствуйте, Karp_P, Вы писали:
K_P>Я тоже уже писал, что с ЛИНКом только разбираюсь и что не всё еще понимаю! Потому, ясен перец, спрашиваю у знающих! Так же я писал, что не понимаю, что значит "де-факто в приложении будут определены эти сущности"! И описал элементарную ситуацию, когда мне нужны все колонки или часть из них. У меня в приложении на АДО.НЕТ с самого начала (ПЕРВЫМ действием) выбираются строки из большой таблицы. Пускай не из всех колонок, но и то что выбирается количеством равно 10. Если запрашивать через ЛИНК, то, блин, лучше уж как есть через АДО, потому как описывать класс с десятью свойствами — это большой кусок кода и выигрыша я не заметил, кроме явной типизации . Так же я представил простенький запросик на адо когда ВСЕ это делается в 7 строк кода. И потом делай что хочешь с этой таблицей. Так же я писал, что не понимаю такого поведения ЛИНКа, если он пришел в качестве альтернативы АДО!! Вместо 7 строк кода целых 26!!! это ли улучшение?!! Вот чего я не понимаю!
K_P>P.S. Если б я разбирался в ЛИНКе, естественно, я бы не писал на форум! Как вы считаете?!
чем не устраивает автоматическая генерация классов для таблиц?
Здравствуйте, Karp_P, Вы писали:
K_P>Здравствуйте, Slider_spb, Вы писали:
K_P>>>Я представлял так, что ЛИНК замена Адо.Нет (интеграция, типизация, и прочие удобства разработки). А вот такую простую задачу как вывод всей таблицы в объект(или какой-то его части), без предварительного описания объекта-приемника, не делает? На адо это было удобно — взял таблицу хоть полностью, хоть часть и запихнул в объект не утруждаясь описанием полей. Я, конечно, понимаю, что поля будут не типизированы, но все-таки сразу получаем проекцию. S_>>Linq вообще-то не замена ADO.NET, а замена Dataset... S_>>Интересно, каким таким способом вы с помощью ADO берёте таблицу без описания её структуры?
K_P>Я уже писал об этом словами. K_P>сейчас кодом:
K_P>
K_P> DataTable table = new DataTable();
K_P> using (SqlConnection sqlCon = new SqlConnection(stringConnection))
K_P> {
K_P> SqlCommand sCommand = new SqlCommand("select * from Customers", sqlCon);
K_P> SqlDataAdapter sdaAdapter = new SqlDataAdapter();
K_P> sdaAdapter.Fill(table);
K_P> }
K_P>
Смысл перехода к линку состоит как раз в отказе от нетипизированных коллекций, которыми является DataSet.
Если вы не хотите от них отказываться — оставайтесь на DataSet.
А если какие-то "религиозные" соображения не позвоялеют вам использовать объектно-реляционный конструктор, то используйте анонимные типы.
Здравствуйте, IvanDunaev, Вы писали:
ID>чем не устраивает автоматическая генерация классов для таблиц?
Мужики, я вроде на русском пишу...
Уф... Еще раз. Есть ситуация. КОНКРЕТНАЯ ситуация. ВОТ ОНА.
K_P>Разбираюсь с LINQ'ом. K_P>Разбирался со следующим вопросом. K_P>Пытаюсь подключиться к базе данных и считать из нее таблицу с помощью запроса на LINQ'е.
K_P>
K_P>namespace MyLinq2
K_P>{
K_P> [Table( Name = "Customers")]
K_P> public class CustomerMember
K_P> {
K_P> [Column(Name = "CompanyName")]
K_P> public string stCompanyName {get; set;}
K_P> }
K_P> class Program
K_P> {
K_P> static void Main(string[] args)
K_P> {
K_P> DataContext dcConnect = new DataContext("server=192.168.40.63;Integrated security=SSPI;Persist Security Info=False;Initial Catalog=Northwind;Connect Timeout=600");
K_P> Table<CustomerMember> table = dcConnect.GetTable<CustomerMember>();
K_P> dcConnect.Log = Console.Out;
K_P> var valueType =
K_P> from t in table
K_P> select t.stCompanyName;
K_P> foreach (var v in valueType)
K_P> Console.WriteLine("Field is " + v);
K_P> Console.ReadKey();
K_P> }
K_P> }
K_P>}
K_P>
K_P>Все отрабатывает хорошо. Но если мне нужна не одна колонка из строки а все, то что я должен каждую колонку описывать в классе-приемнике?!! На ADO.NET этот вопрос решался элементарно. Объявлялся объект класса DataTable и просто передавался в объект SqlDataAdapter. Всё! А тут как?
И мой вопрос — Как вот здесь (ИМЕННО И КОНКРЕТНО в таком контексте) не описывать класс с 10 свойствами, а сделать намного короче. Вот как тут сделать, что бы получился компактный код с использованием ЛИНКа?!! а не 26 строк кода токо описания класса....
Здравствуйте, Karp_P, Вы писали:
K_P>Здравствуйте, yoriсk.kiev.ua, Вы писали:
YKU>>А почему не поручить эту работу студии? MSLinqToSQLGenerator
K_P>MSLinqToSQLGenerator — что за зверь? Я так понял какая-то сборка в составе студии?
Э... Вроде шатная штука 2008-й студии. Есть еще косольная утилита SQLMetal.
Я вообще не совсем понял, зачем вам этот "закат Солнца вручную" с ручным описанием таблиц. Вроде ж каждый Linq2SQL: getting started начинается словами: "создайте dbml, откройте r/o дизайнер, перетащите таблицы и получите нагенерённые классы". Вот с этими классами и работайте.
Здравствуйте, Karp_P, Вы писали:
K_P>И мой вопрос — Как вот здесь (ИМЕННО И КОНКРЕТНО в таком контексте) не описывать класс с 10 свойствами, а сделать намного короче. Вот как тут сделать, что бы получился компактный код с использованием ЛИНКа?!! а не 26 строк кода токо описания класса....
project — add new item — data — linq to sql classes
Здравствуйте, Karp_P, Вы писали:
K_P>Все отрабатывает хорошо. Но если мне нужна не одна колонка из строки а все, то что я должен каждую колонку описывать в классе-приемнике?!! На ADO.NET этот вопрос решался элементарно. Объявлялся объект класса DataTable и просто передавался в объект SqlDataAdapter. Всё! А тут как?
Там дизайнер есть — пец и готово! Классы создаются автоматически на основании таблиц в БД.
Здравствуйте, Karp_P, Вы писали:
K_P>Я тоже уже писал, что с ЛИНКом только разбираюсь и что не всё еще понимаю! Потому, ясен перец, спрашиваю у знающих! Так же я писал, что не понимаю, что значит "де-факто в приложении будут определены эти сущности"! И описал элементарную ситуацию, когда мне нужны все колонки или часть из них. У меня в приложении на АДО.НЕТ с самого начала (ПЕРВЫМ действием) выбираются строки из большой таблицы. Пускай не из всех колонок, но и то что выбирается количеством равно 10. Если запрашивать через ЛИНК, то, блин, лучше уж как есть через АДО, потому как описывать класс с десятью свойствами — это большой кусок кода и выигрыша я не заметил, кроме явной типизации . Так же я представил простенький запросик на адо когда ВСЕ это делается в 7 строк кода. И потом делай что хочешь с этой таблицей. Так же я писал, что не понимаю такого поведения ЛИНКа, если он пришел в качестве альтернативы АДО!! Вместо 7 строк кода целых 26!!! это ли улучшение?!! Вот чего я не понимаю!
Ты описываешь ситуацию, которой на самом деле не существует, она надуманная. Де-факто, у тебя всегда будет также создание/удаление сущностей, для которых все равно ты будешь заводить кужные классы. А раз так, то и не будет проблемы с получение произвольных выборок.
ID>project — add new item — data — linq to sql classes
ID>студия сгенерирует классы для указанных таблиц
О! Вот то, что нужно! Большое спасибо!!!
Еще вопрос в догонку.
Используя, "старый" подход на АДО.НЕТ для выполнения запроса необходимо было создать подключение. И хорошим (да, что там! Обязательным) тоном было использование using для контроля правильности выполнения кода и последующего обязательного особождения подключения. То есть
using (SqlConnection sqlCon = new SqlConnection(stringConnection))
{
//какие-то действия
}
в ЛИНКе я так понял эту функцию выполняет DataContext. Т.е.
DataClasses1DataContext dc1DContext = new DataClasses1DataContext();var date =
from sup in dc1DContext.Suppliers
where sup.CompanyName.StartsWith("L")
orderby sup.CompanyName
select sup;
foreach(var d in date)
Console.WriteLine("Date = " + d.CompanyName );
инициализируем DataContext, описываем запрос, ну и потом уже выполняем его в foreach'е ...
Нужно здесь каким-то образом "перестраховываться" с помощью подобным using'у конструкциям или же ЛИНК скрывает от нас этот функционал и проблем нет?....