2015-10-27 3 views
2

Я пытаюсь найти лучший способ вставить несколько записей (более 200), если они не существуют, не совершая поездки для каждой записи, чтобы проверить, существует ли она, Мне это нравится:Entity Framework Проверьте, существует ли несколько записей перед вставкой

foreach (var node in nodes) 
{ 
    if (!context.Nodes.Any(x => x.Name == node.Name)) 
    { 
     context.Nodes.Add(new NWatchNode(node)); 
    } 

    try 
    { 
     if (context.Nodes.Local.Any()) 
     { 
      context.SaveChanges(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw new Exception(ex.Message); 
    } 
} 

Каков наилучший способ для этого?

ответ

5

Предполагая, что node.Name является уникальным в таблице в базе данных, вы могли бы сделать что-то вроде этого сузить список узлов для тех, которые не существуют:

var missingRecords = nodes.Where(x => !context.Nodes.Any(z => z.Name == x.Name)).ToList(); 

Затем вставьте недостающие записи с чем-то вроде :

context.Nodes.AddRange(missingRecords); 
+0

Выполняет ли это все отдельную инструкцию SQL для каждого узла или отправляет ли она все в одном запросе? – blgrnboy

+0

Я не уверен, как Entity Framework обрабатывает AddRange за кулисами. Я считаю, что он должен сделать все это как одну большую транзакцию и сохранить транзакцию при вызове 'context.SaveChanges();' Возможно, вы можете запустить профилировщик SQL и посмотреть, как он обрабатывается на SQL-сервере. –

+0

К сожалению, я хотел получить недостающие записи. Будет ли он отправлять один оператор для каждой записи, которую он проверяет? – blgrnboy

Смежные вопросы