2015-08-03 1 views
0

У меня есть около 100 элементов (allRights) в базе данных и около 10 id-s для поиска (inputRightsIds). Какой из них лучше - первое, чтобы получить все права, а затем искать элементы (Вариант 1) или сделать 10 проверку запросов запросов к базе данных Вот несколько примеров кода:EF - Правильный способ поиска нескольких элементов в базе данных

DbContext db = new DbContext(); 
int[] inputRightsIds = new int[10]{...}; 

Вариант 1

var allRights = db.Rights.ToLIst(); 

foreach(var right in allRights) 
{ 
    for(int i>0; i<inputRightsIds.Lenght; i++) 
    { 
     if(inputRightsIds[i] == right.Id) 
     { 
      // Do something 
     } 
    } 
} 

Вариант 2

for(int i>0; i<inputRightsIds.Lenght; i++) 
{ 
    if(db.Rights.Any(r => r.Id == inputRightsIds[i]);) 
    { 
     // Do something 
    } 
} 

Спасибо заранее!

ответ

1

Как уже говорилось, вы должны сделать следующее.

var matchingIds = from r in db.Rights 
        where inputRightIds.Contains(r.Id) 
        select r.Id; 

foreach(var id in matchingIds) 
{ 
    // Do something 
} 

Но это отличается от обоих ваших подходов. В вашем первом подходе вы делаете один SQL-вызов в БД, который возвращает больше результатов, чем вас интересует. Во-вторых, несколько вызовов SQL возвращают часть необходимой вам информации при каждом вызове. Вышеприведенный запрос сделает один SQL-вызов в БД и вернет только те данные, которые вас интересуют. Это лучший подход, поскольку он уменьшает две стороны бутылки для совершения нескольких вызовов в БД и получения слишком большого количества данных.

1

Вы можете использовать следующие:

db.Rights.Where(right => inputRightsIds.Contains(right.Id)); 
+0

Вы должны объяснить, как это отличается от того, что OP уже придумал и почему это лучше. – juharr

1

Они должны быть очень похожи скорости, так как оба они должны перечислить массивы одним и тем же число раз. Там могут быть тонкие различия в скорости между двумя в зависимости от входных данных, но в целом я бы пошел с Вариант 2. Я думаю, вы почти всегда предпочитаете LINQ по ручному перечислению, когда это возможно. Также рассмотрите возможность использования следующего оператора LINQ для упрощения всего поиска в одной строке.

var matches = db.Rights.Where(r=> inputRightIds.Contains(r.Id)); 
...//Do stuff with matches 
+0

Технически это третий вариант одного вызова SQL, чтобы просто вернуть требуемый результат. Это отличается от варианта 2, который делает несколько вызовов SQL и вариант 1, который делает один большой вызов SQL, а затем фильтрует. – juharr

1

Не забудьте получить все элементы в памяти для списка процессов дальнейшего

var itemsFromDatabase = db.Rights.Where(r => inputRightsIds.Contains(r.Id)).ToList(); 

Или вы могли бы даже перечислить через коллекцию и сделать некоторые вещи по каждому пункту

db.Rights.Where(r => inputRightsIds.Contains(r.Id)).ToList().Foreach(item => { 
     //your code here 
}); 
Смежные вопросы