powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как извлечь из БД сразу несколько записей по условию ?
7 сообщений из 7, страница 1 из 1
EF. Как извлечь из БД сразу несколько записей по условию ?
    #38815583
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, как извлечь из БД не одну запись, а сразу несколько, по условию.

Вот имеется код
Код: c#
1.
2.
3.
4.
5.
foreach (var itemToUpdate in listToUpdate)
{
var myObj = db.CreateObjectSet<MyObject>().Single(v => v.Id == itemToUpdate.Id);
... апдейтинг объекта
}



Но он очень не оптимальный. Помогите улучшить.

В SQL я бы написал что то типа "where id in (список)". Да это будет не эффективно, т.к. придется использовать динамический запрос (не известное заранее количество элементов), но зато один коннект и один проход по базе.

Как это написать в EF ?
...
Рейтинг: 0 / 0
EF. Как извлечь из БД сразу несколько записей по условию ?
    #38815604
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekВ SQL я бы написал что то типа "where id in (список)". Да это будет не эффективно, т.к. придется использовать динамический запрос (не известное заранее количество элементов)
Глупости. Никакой динамики тут не нужно.

Код: c#
1.
var categories = ctx.Categories.Where(c => new[] { 1, 2, 3 }.Contains(c.CategoryId));
...
Рейтинг: 0 / 0
EF. Как извлечь из БД сразу несколько записей по условию ?
    #38815633
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос разрешите.

Как писать ПРАВИЛЬНО ?

Код: c#
1.
2.
3.
4.
5.
6.
7.
var myObjectsSet = db.CreateObjectSet<myObject>();
foreach (var itemToInsert in listToInsert)
{
	var persistent = valuesSet.CreateObject<MyObject>();
	...
}
db.SaveChanges();



или

Код: c#
1.
2.
3.
4.
5.
6.
foreach (var itemToInsert in listToInsert)
{
	var persistent = db.CreateObject<MyObject>();
	...
}
db.SaveChanges();



?
...
Рейтинг: 0 / 0
EF. Как извлечь из БД сразу несколько записей по условию ?
    #38815635
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Спасибо большое Вам за ответ. Очень рад, что вы снова появились на форуме :) Очень давно не видел, либо я просто слишком редко сюда захожу.
...
Рейтинг: 0 / 0
EF. Как извлечь из БД сразу несколько записей по условию ?
    #38815642
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekЕще вопрос разрешите. Как писать ПРАВИЛЬНО ?
Никак, оба варианта на помойку. Зачем вообще CreateObjectSet? Гораздо проще общаться с нормальными сетами.

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
var ctx = new Entities();
ctx.Configuration.ProxyCreationEnabled = false;

// in
var categories = ctx.Categories.Where(c => new[] { 1, 2, 3}.Contains(c.CategoryId));
foreach (var c in categories)
{
    Console.WriteLine(c.Name);
}

// get by id
var category = ctx.Categories.FirstOrDefault(x => x.CategoryId == 4);
category.Name += "*";            

// create
ctx.Categories.Add(new Category { Name = "*" });

ctx.SaveChanges();



ну и так далее...

ProBiotekМСУ, Спасибо большое Вам за ответ. Очень рад, что вы снова появились на форуме :) Очень давно не видел, либо я просто слишком редко сюда захожу.
Ок :)
...
Рейтинг: 0 / 0
EF. Как извлечь из БД сразу несколько записей по условию ?
    #38821970
ProBiotek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
МСУ,

Вот еще вопросик, поставивший меня в тупик.
МСУ, Вы кажется эксперт в EF, подскажите пожалуйста.

Делаю простой апдейт элементов в таблице:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
                 using (var db = this.CreateContext())
                 {
                   db.Configuration.ProxyCreationEnabled = false; // PS. Так и не понял, что делает эта строка :)
                  
                   var elements = db.Elements.Where(el=> usersArray.Contains(el.userId)).ToList();
                   
                   foreach (var item in elements)
                   {
                     // апдейт записей.
                   }               
                   db.SaveChanges();
                 }





Профайлер SQL показывает, что после вызова метода SaveChanges - EF кидает кучу отдельных запросов в БД.

Код: xml
1.
2.
3.
                 RPC:Completed	exec sp_executesql N'UPDATE [MySchema].[Element] SET [Field1] = @0 WHERE ([Id] = @1)',N'@0 bit,@1 int',@0=1,@1=1301	.Net SqlClient Data Provider
                 RPC:Completed	...
                 RPC:Completed	...




Почему в разных транзациях то ?

Мне это не нравится... По моему так не должно быть. Если я апдейчу 10 000 записей, то EF делает 10 тысяч запросов в БД ??
База упадет уже после 10 параллельных юзеров (ну хорошо, не с 10) с такими нагрузками.

Объясните пожалуйста, что я делаю не так. Может я чего то не понимаю.
...
Рейтинг: 0 / 0
EF. Как извлечь из БД сразу несколько записей по условию ?
    #38822844
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ProBiotekПочему в разных транзациях то?В разных батчах. Транзакция на один SaveChanges() одна.
ProBiotekОбъясните пожалуйста, что я делаю не так. Может я чего то не понимаю.Всё верно, в EF нет "родного" пакетного сохранения. Но есть сторонние расширения. Например .
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / EF. Как извлечь из БД сразу несколько записей по условию ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]