В linq to entity, как получить объекты, соответствующие списку условий, без циклов? - PullRequest
0 голосов
/ 23 февраля 2010

Я играю с базой данных MySQL, используя инфраструктуру сущностей ADO (через devart dot.connect).

Я получаю списки объектов сущностей (a) из списков и хочу сделать запрос linq, извлекающий все объекты из данной таблицы сущностей (b), где есть внешний ключ b:

//THIS WORKS :
IQueryable<Nb_student> nbstud = MainForm.context.Nb_student_set;
IQueryable<Cat_student> catstud = MainForm.context.Cat_student_set.Where(c => c.id == 2);

var test1 = from nb in nbstud
            join bb in catstud on nb.cat_student_id equals bb.id
            select nb;

=> это дает мне только соответствие nb_students (это то, что я хочу ...)

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

IEnumerable<Cat_student> catstud2 = param_cat_students.AsEnumerable();
var ttt2 = from nb in nbstud
           join bb in catstud2 on nb.cat_student_id equals bb.id
           select nb;

=> это не работает, ошибка следующая: {"Невозможно создать постоянное значение типа 'System.Collections.Generic.IEnumerable`1'. Только примитивные типы (', такие как Int32, String, и Guid ') поддерживаются в этом контексте. "} Кажется, есть проблема с идентификаторами (int32) для объединения ???

В более общем плане, мой вопрос таков: в Linq to Entity, как выбирать элементы из таблицы, соответствующие различным спискам критериев (списки не известны заранее, так как они выбираются пользователями), без создания большого количества циклов. Думаю, что решением было Join, я также безуспешно попробовал синтаксис .any и .contain:

var tt3 = from nb in nbstud.Where
          (nbx => catstud2.Any(cat => cat.id == nbx.cat_student_id)
          select nb;

Если бы вы могли посоветовать мне ... Я полагаю, это очень распространенная проблема, но я не знаю, как действовать дальше. Заранее благодарю,

Pierre

1 Ответ

2 голосов
/ 23 февраля 2010

Если вы используете Linq 2 Entities 4 Я думаю, вы можете сделать

/* Get ids of selected elements */
IEnumerable<int> catstud2 = param_cat_students.AsEnumerable().Select(s => s.id);

/* Select the elements with the given ids from the database */
var ttt2 = from nb in nbstud where catstud2.Contains(nb.id);

Если я правильно помню, .Contains будет преобразовано в оператор SQL IN. Тем не менее, я думаю, что есть верхняя граница для числа элементов, разрешенных в catstud2. Вы также можете сделать это с Linq2SQL, в то время как .Contains не поддерживается в Linq2Entities 1.0.

Если вы используете Linq2Entities 1.0, я думаю, вам придется сделать выбор между циклом (и выполнением нескольких одноэлементных поисков) и извлечением всего содержимого таблицы из базы данных в память (используя .AsEnumerable()) Делаем объединение в памяти.

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