LINQ to SQL
От: Karp_P  
Дата: 27.11.09 11:49
Оценка: :)
Доброго дня!

Разбираюсь с 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. Всё! А тут как?
Re: LINQ to SQL
От: Пельмешко Россия blog
Дата: 27.11.09 11:53
Оценка:
Здравствуйте, Karp_P, Вы писали:

K_P>Все отрабатывает хорошо. Но если мне нужна не одна колонка из строки а все, то что я должен каждую колонку описывать в классе-приемнике?!! На ADO.NET этот вопрос решался элементарно. Объявлялся объект класса DataTable и просто передавался в объект SqlDataAdapter. Всё! А тут как?


Смотря что Вы дальше собираетесь делать Может анонимные типы помогут?
                            from t in table
                            select new { t.stCompanyName, t.stSomeOtherProperty, t.stFoo };
Re[2]: LINQ to SQL
От: Lloyd Россия  
Дата: 27.11.09 11:57
Оценка:
Здравствуйте, Пельмешко, Вы писали:

П>Смотря что Вы дальше собираетесь делать Может анонимные типы помогут?

П>
П>                            from t in table
П>                            select new { t.stCompanyName, t.stSomeOtherProperty, t.stFoo };
П>


Для этого все равно придется описать имена колонок в определении entity
Re: LINQ to SQL
От: Lloyd Россия  
Дата: 27.11.09 11:58
Оценка:
Здравствуйте, 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. Всё! А тут как?


А как вы дальше работали с этим DataTable-ом?
Re[3]: LINQ to SQL
От: Karp_P  
Дата: 27.11.09 12:01
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Пельмешко, Вы писали:


П>>Смотря что Вы дальше собираетесь делать Может анонимные типы помогут?

П>>
П>>                            from t in table
П>>                            select new { t.stCompanyName, t.stSomeOtherProperty, t.stFoo };
П>>


L>Для этого все равно придется описать имена колонок в определении entity


Вот в том-то и дело! А если я "не знаю" структуру таблицы, не говоря уже о том, что мне может быть просто лень описывать специальный класс, описывающий все поля таблицы — этож какая работа для простого запроса таблицы целиком?!!
Re[4]: LINQ to SQL
От: Lloyd Россия  
Дата: 27.11.09 12:04
Оценка:
Здравствуйте, Karp_P, Вы писали:

L>>Для этого все равно придется описать имена колонок в определении entity


K_P>Вот в том-то и дело! А если я "не знаю" структуру таблицы, не говоря уже о том, что мне может быть просто лень описывать специальный класс, описывающий все поля таблицы — этож какая работа для простого запроса таблицы целиком?!!


Единственный случай, когда может понадобиться то, о чем вы говорите — это показ данных. Но я с трудом представляю ситуацию, когда приложение нужно только для показа, без редактирования, удаления, создания новых записей.
Re[5]: LINQ to SQL
От: Karp_P  
Дата: 27.11.09 12:11
Оценка:
L>Единственный случай, когда может понадобиться то, о чем вы говорите — это показ данных. Но я с трудом представляю ситуацию, когда приложение нужно только для показа, без редактирования, удаления, создания новых записей.

Я говорю вообще про LINQ как альтернативу ADO.NET. Т.е. приложение полностью написано с использованием выражений LINQ, без использования запросов в стиле адо.нет. Или такое невозможно? А то получается таблицу запрошу чере адо, а вот обработку, изменение, добавление напишу с ЛИНКом.... Уж если использовать то одну технологию. Как это понимать?
Re[6]: LINQ to SQL
От: Lloyd Россия  
Дата: 27.11.09 12:17
Оценка:
Здравствуйте, Karp_P, Вы писали:

K_P>Я говорю вообще про LINQ как альтернативу ADO.NET. Т.е. приложение полностью написано с использованием выражений LINQ, без использования запросов в стиле адо.нет. Или такое невозможно? А то получается таблицу запрошу чере адо, а вот обработку, изменение, добавление напишу с ЛИНКом.... Уж если использовать то одну технологию. Как это понимать?


Если у вас уже есть обновление через linq, то значит все классы сущностей уже определены и значит проблемы, описанной в первом посте нет.
Re[7]: LINQ to SQL
От: Karp_P  
Дата: 27.11.09 12:35
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, Karp_P, Вы писали:


K_P>>Я говорю вообще про LINQ как альтернативу ADO.NET. Т.е. приложение полностью написано с использованием выражений LINQ, без использования запросов в стиле адо.нет. Или такое невозможно? А то получается таблицу запрошу чере адо, а вот обработку, изменение, добавление напишу с ЛИНКом.... Уж если использовать то одну технологию. Как это понимать?


L>Если у вас уже есть обновление через linq, то значит все классы сущностей уже определены и значит проблемы, описанной в первом посте нет.


Извиняюсь! Недопонял... Только пытаюсь разобраться с линком — опыт маааааленький....

Еще раз. Простой случай. Нужно получить таблицу целиком. Потом делать с ней что угодно локально на машине. Потом обратно закинуть на сервер. Вот для этого мне сразу нужно описать класс представляющий таблицу?!!..
По другому никак?
Я представлял так, что ЛИНК замена Адо.Нет (интеграция, типизация, и прочие удобства разработки). А вот такую простую задачу как вывод всей таблицы в объект(или какой-то его части), без предварительного описания объекта-приемника, не делает? На адо это было удобно — взял таблицу хоть полностью, хоть часть и запихнул в объект не утруждаясь описанием полей. Я, конечно, понимаю, что поля будут не типизированы, но все-таки сразу получаем проекцию.
Re[8]: LINQ to SQL
От: Slider_spb Россия  
Дата: 27.11.09 13:49
Оценка:
K_P>Я представлял так, что ЛИНК замена Адо.Нет (интеграция, типизация, и прочие удобства разработки). А вот такую простую задачу как вывод всей таблицы в объект(или какой-то его части), без предварительного описания объекта-приемника, не делает? На адо это было удобно — взял таблицу хоть полностью, хоть часть и запихнул в объект не утруждаясь описанием полей. Я, конечно, понимаю, что поля будут не типизированы, но все-таки сразу получаем проекцию.
Linq вообще-то не замена ADO.NET, а замена Dataset...
Интересно, каким таким способом вы с помощью ADO берёте таблицу без описания её структуры?
Re[8]: LINQ to SQL
От: yoriсk.kiev.ua  
Дата: 27.11.09 14:09
Оценка:
Здравствуйте, Karp_P, Вы писали:

K_P>Еще раз. Простой случай. Нужно получить таблицу целиком. Потом делать с ней что угодно локально на машине. Потом обратно закинуть на сервер. Вот для этого мне сразу нужно описать класс представляющий таблицу?!!..


А почему не поручить эту работу студии? MSLinqToSQLGenerator
Re[9]: LINQ to SQL
От: Karp_P  
Дата: 27.11.09 14:12
Оценка:
Здравствуйте, 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);
            }
Re[9]: LINQ to SQL
От: Karp_P  
Дата: 27.11.09 14:21
Оценка:
Здравствуйте, yoriсk.kiev.ua, Вы писали:

YKU>А почему не поручить эту работу студии? MSLinqToSQLGenerator


MSLinqToSQLGenerator — что за зверь? Я так понял какая-то сборка в составе студии?
Re[10]: LINQ to SQL
От: Lloyd Россия  
Дата: 27.11.09 14:22
Оценка:
Здравствуйте, Karp_P, Вы писали:

S_>>Linq вообще-то не замена ADO.NET, а замена Dataset...

S_>>Интересно, каким таким способом вы с помощью ADO берёте таблицу без описания её структуры?


K_P>Я уже писал об этом словами.


Тебе уже вроде бы написали, что де-факто в приложении будут определены эти сущности. Поэтому потребность в нетипизированных запросах (aka DataTable) — надуманная.
Re[11]: LINQ to SQL
От: Karp_P  
Дата: 27.11.09 14:44
Оценка:
Здравствуйте, Lloyd, Вы писали:

K_P>>Я уже писал об этом словами.


L>Тебе уже вроде бы написали, что де-факто в приложении будут определены эти сущности. Поэтому потребность в нетипизированных запросах (aka DataTable) — надуманная.


Я тоже уже писал, что с ЛИНКом только разбираюсь и что не всё еще понимаю! Потому, ясен перец, спрашиваю у знающих! Так же я писал, что не понимаю, что значит "де-факто в приложении будут определены эти сущности"! И описал элементарную ситуацию, когда мне нужны все колонки или часть из них. У меня в приложении на АДО.НЕТ с самого начала (ПЕРВЫМ действием) выбираются строки из большой таблицы. Пускай не из всех колонок, но и то что выбирается количеством равно 10. Если запрашивать через ЛИНК, то, блин, лучше уж как есть через АДО, потому как описывать класс с десятью свойствами — это большой кусок кода и выигрыша я не заметил, кроме явной типизации . Так же я представил простенький запросик на адо когда ВСЕ это делается в 7 строк кода. И потом делай что хочешь с этой таблицей. Так же я писал, что не понимаю такого поведения ЛИНКа, если он пришел в качестве альтернативы АДО!! Вместо 7 строк кода целых 26!!! это ли улучшение?!! Вот чего я не понимаю!

P.S. Если б я разбирался в ЛИНКе, естественно, я бы не писал на форум! Как вы считаете?!
Re[12]: LINQ to SQL
От: IvanDunaev  
Дата: 27.11.09 14:53
Оценка:
Здравствуйте, Karp_P, Вы писали:

K_P>Я тоже уже писал, что с ЛИНКом только разбираюсь и что не всё еще понимаю! Потому, ясен перец, спрашиваю у знающих! Так же я писал, что не понимаю, что значит "де-факто в приложении будут определены эти сущности"! И описал элементарную ситуацию, когда мне нужны все колонки или часть из них. У меня в приложении на АДО.НЕТ с самого начала (ПЕРВЫМ действием) выбираются строки из большой таблицы. Пускай не из всех колонок, но и то что выбирается количеством равно 10. Если запрашивать через ЛИНК, то, блин, лучше уж как есть через АДО, потому как описывать класс с десятью свойствами — это большой кусок кода и выигрыша я не заметил, кроме явной типизации . Так же я представил простенький запросик на адо когда ВСЕ это делается в 7 строк кода. И потом делай что хочешь с этой таблицей. Так же я писал, что не понимаю такого поведения ЛИНКа, если он пришел в качестве альтернативы АДО!! Вместо 7 строк кода целых 26!!! это ли улучшение?!! Вот чего я не понимаю!


K_P>P.S. Если б я разбирался в ЛИНКе, естественно, я бы не писал на форум! Как вы считаете?!


чем не устраивает автоматическая генерация классов для таблиц?
Re[10]: LINQ to SQL
От: Slider_spb Россия  
Дата: 27.11.09 15:03
Оценка:
Здравствуйте, 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.
А если какие-то "религиозные" соображения не позвоялеют вам использовать объектно-реляционный конструктор, то используйте анонимные типы.
Re[13]: LINQ to SQL
От: Karp_P  
Дата: 27.11.09 15:04
Оценка:
Здравствуйте, 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 строк кода токо описания класса....
Re[10]: LINQ to SQL
От: yoriсk.kiev.ua  
Дата: 27.11.09 15:07
Оценка: 2 (1)
Здравствуйте, Karp_P, Вы писали:

K_P>Здравствуйте, yoriсk.kiev.ua, Вы писали:


YKU>>А почему не поручить эту работу студии? MSLinqToSQLGenerator


K_P>MSLinqToSQLGenerator — что за зверь? Я так понял какая-то сборка в составе студии?


Э... Вроде шатная штука 2008-й студии. Есть еще косольная утилита SQLMetal.

Я вообще не совсем понял, зачем вам этот "закат Солнца вручную" с ручным описанием таблиц. Вроде ж каждый Linq2SQL: getting started начинается словами: "создайте dbml, откройте r/o дизайнер, перетащите таблицы и получите нагенерённые классы". Вот с этими классами и работайте.

Вот первое, что нагуглилось:
http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
Re[14]: LINQ to SQL
От: IvanDunaev  
Дата: 27.11.09 15:09
Оценка: 3 (1)
Здравствуйте, Karp_P, Вы писали:

K_P>И мой вопрос — Как вот здесь (ИМЕННО И КОНКРЕТНО в таком контексте) не описывать класс с 10 свойствами, а сделать намного короче. Вот как тут сделать, что бы получился компактный код с использованием ЛИНКа?!! а не 26 строк кода токо описания класса....


project — add new item — data — linq to sql classes

студия сгенерирует классы для указанных таблиц
Re: LINQ to SQL
От: Flem1234  
Дата: 27.11.09 15:35
Оценка:
Здравствуйте, Karp_P, Вы писали:

K_P>Все отрабатывает хорошо. Но если мне нужна не одна колонка из строки а все, то что я должен каждую колонку описывать в классе-приемнике?!! На ADO.NET этот вопрос решался элементарно. Объявлялся объект класса DataTable и просто передавался в объект SqlDataAdapter. Всё! А тут как?


Там дизайнер есть — пец и готово! Классы создаются автоматически на основании таблиц в БД.
Re[12]: LINQ to SQL
От: Lloyd Россия  
Дата: 27.11.09 16:18
Оценка: +1
Здравствуйте, Karp_P, Вы писали:

K_P>Я тоже уже писал, что с ЛИНКом только разбираюсь и что не всё еще понимаю! Потому, ясен перец, спрашиваю у знающих! Так же я писал, что не понимаю, что значит "де-факто в приложении будут определены эти сущности"! И описал элементарную ситуацию, когда мне нужны все колонки или часть из них. У меня в приложении на АДО.НЕТ с самого начала (ПЕРВЫМ действием) выбираются строки из большой таблицы. Пускай не из всех колонок, но и то что выбирается количеством равно 10. Если запрашивать через ЛИНК, то, блин, лучше уж как есть через АДО, потому как описывать класс с десятью свойствами — это большой кусок кода и выигрыша я не заметил, кроме явной типизации . Так же я представил простенький запросик на адо когда ВСЕ это делается в 7 строк кода. И потом делай что хочешь с этой таблицей. Так же я писал, что не понимаю такого поведения ЛИНКа, если он пришел в качестве альтернативы АДО!! Вместо 7 строк кода целых 26!!! это ли улучшение?!! Вот чего я не понимаю!


Ты описываешь ситуацию, которой на самом деле не существует, она надуманная. Де-факто, у тебя всегда будет также создание/удаление сущностей, для которых все равно ты будешь заводить кужные классы. А раз так, то и не будет проблемы с получение произвольных выборок.
Re[15]: LINQ to SQL
От: Karp_P  
Дата: 30.11.09 10:42
Оценка:
Здравствуйте, IvanDunaev, Вы писали:


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'у конструкциям или же ЛИНК скрывает от нас этот функционал и проблем нет?....
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.