использование .Contains () с linq-to-sql - PullRequest
3 голосов
/ 27 января 2012

У меня есть следующий запрос, который получает список значений в качестве параметра:

public int GetMostRecent(List<int> TheIDs)
{
 ...using MyDC...

   var TheMostRecentID = (from d in MyDC.Data
                           where TheIDs.Contains(d.ID)
                           orderby d.DateTime
                           select d.ID).LastOrDefault(); 
}

Это лучший способ сопоставить список в коллекции параметров с данными в базе данных, или есть лучший способ, чем использование метода .Contains () в linq-to-sql.

Спасибо.

Ответы [ 3 ]

8 голосов
/ 27 января 2012

То, что у вас есть, правильно.Это будет преобразовано в предложение IN в SQL со значениями, предоставленными в коллекции.

В несвязанной заметке следует попробовать упорядочить запрос по дате по убыванию и использовать FirstOrDefault().Как и сейчас, вы собираетесь вернуть весь набор результатов и выбросить все строки, кроме одной.

2 голосов
/ 13 марта 2015

Вы должны быть осторожны с такими запросами с list.Contains() внутри linq query. Потому что для каждого элемента списка будет создан параметр в sql statement.

И в выражении sql допускается ограниченное количество параметров, <= 2100. Так что если ваш TheIDs будет содержать более 2100 элементов, он будет fail .

Если вы хотите использовать этот способ, вы должны хотя бы проверить свои TheIDs count и, если их больше, чем 2100, разделите их на куски с количеством элементов 2100.

1 голос
/ 27 января 2012

Это преобразуется в эффективный SQL, поэтому больше не нужно ничего использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...