Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Можно ли сделать одним запросом? LinqToSql 
:(
    Опции темы
Rohoss
Дата 7.5.2010, 03:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



Этот корявый код создаёт 100500 запросов к базе данных. 
Код

class Program
    {
        static void Main(string[] args)
        {
            DataClasses1DataContext dc = new DataClasses1DataContext(@"Data Source=BSR;Initial Catalog=temp;Integrated Security=True");
            var t = dc.TestTables;
  
            List<Container> CList = new List<Container>();

            for (int i = 0; i < 100; i++)
            {
                Container c = new Container();
                c.Id = i;
                c.TT = t;
                CList.Add(c);
            }

            foreach (var r in CList)
            {
                Console.WriteLine(r.Name);
            }

            Console.ReadLine();
        }
    }

    public class Container
    {
        Table<TestTable> tt = null;

        int id;

        public Table<TestTable> TT
        {
            set { tt = value; }
        }

        public int Id
        {
            set { id = value; }
        }

        public string Name
        {
            get
            {
                var r = from c in tt where c.Id == id select c;

                if (r.Count() > 0)
                {
                    return r.First().Name;
                }
                else
                {
                    return "r.First().Name";
                }

                
            }
        }
    }


А возможно ли сделать всё это одним запросом, не меняя особо структуры? Я думаю, что нет, но может о каких-то моментах не в курсе…

Добавлено через 1 минуту и 45 секунд
Имею ввиду, чтобы запросы Linq преобразовались только в один Sql запрос


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
KelTron
Дата 7.5.2010, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 2
Всего: 38



Как вариант, можно получить всю коллекцию сразу, а потом делать выборку из памяти. Типа такого:
Код

var t = dc.TestTables.ToList();
...

Тогда будет только 1 запрос, но не очень ясны условия задачи, поэтому что то более вменяемое предложить не могу...


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Любитель
Дата 7.5.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



А что вы хотите-то?! Получить имена для всех элементов с айдищником в диапазоне от 0 до 99?
Код

var namesByID = dataContext.Entities
    .Where(e => e.ID >= 0 && && e.ID < 100)
    .ToDictionary(e => e.ID, e => e.Name);
var names = Enumerable.Range(0, 100).Select(n => namesByID.ContainsKey(n) ? namesByID[n] : "-");



--------------------
PM MAIL ICQ Skype   Вверх
Rohoss
Дата 7.5.2010, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



Цитата(KelTron @  7.5.2010,  11:54 Найти цитируемый пост)
Тогда будет только 1 запрос, но не очень ясны условия задачи, поэтому что то более вменяемое предложить не могу...

Да это просто интерес. В реальной задачи есть свойства, которые получают текст через запрос. Обращений будет много, следовательно запросов тоже. Придётся переделать структуру, дабы не плодить 100500 запросов  smile .

Цитата(Любитель @  7.5.2010,  13:43 Найти цитируемый пост)
А что вы хотите-то?! Получить имена для всех элементов с айдищником в диапазоне от 0 до 99?

ну не совсем, это только для примера... 

В общем хотелось бы, чтобы dc.TestTables заполнился данными изначально, и уже не обращался к базе. Но похоже не реально. Нужно преобразовывать в список. Всем спасибо, вопрос решён.


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
Любитель
Дата 7.5.2010, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: нет
Всего: 92



1. Для "загрузки" таблицы достаточно логично вызывать нечто, перегоняющее в структуру в памяти.
2. Для lazy loading свойств в L2SQL можно задать DataLoadingOptions (с LoadWith).


--------------------
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.