NHibernate Linq where clause: значение в коллекции

Мне интересно, могу ли я сделать предложение where, которое принимает коллекцию?

List<string> myStrings = new List<strings> {"1", "2"};

session.Query<Table>().Where(x => x.Id == myStrings).ToList();

Я в основном хочу получить все строки из моей таблицы db, которые соответствуют всему в этом запросе.

session.Query<Table>().Where(x => x.Id == myStrings[0]).ToList();
session.Query<Table>().Where(x => x.Id == myStrings[1]).ToList();
session.Query<Table>().Where(x => x.Id == myStrings[N]).ToList();

Вот что мне нужно сделать прямо сейчас. Я бы, вероятно, рассмотрел это в цикле for, но это много запросов, и я предпочитаю просто выполнить один запрос.

Или мне нужно использовать синтаксис запроса nhibernate create

var query = "Select * From Where In (:Id)";
session.CreateQuery(query)SetParameter("Id",myStrings) // not sure if I have to something like .ExecuteUpdate(); but just for select instead

person chobo2    schedule 18.04.2011    source источник


Ответы (3)


вы должны использовать метод расширения Any или All в своей коллекции

person frabiacca    schedule 18.04.2011
comment
не могли бы вы привести пример или он такой же, как Femaref? - person chobo2; 19.04.2011

person    schedule
comment
У меня есть этот session.Query ‹Table› () .Where (x = ›myString.All (s =› x.myString == s)). ToList (); и я получаю "Указанный метод не поддерживается". Я также пробовал то, что у вас было, что == не может быть применено к операндам типа Table - person chobo2; 19.04.2011
comment
О, должно было быть x.Id. Однако, если NHibernate не может получить доступ к коллекции myString, у вас есть проблема - и я на самом деле не связан с NHibernate, чтобы давать вам советы. Прости. - person Femaref; 19.04.2011
comment
@Femaref - Значит, это проблема с гибернацией? - person chobo2; 19.04.2011
comment
К сожалению, это так. Библиотека NHibernate LINQ, вероятно, не настолько продвинута. В рамках entity framework или linq to sql это сработает. Вероятно, вам придется придерживаться синтаксиса запроса на создание. - person Femaref; 19.04.2011
comment
во-первых, nhibernate linq не так продвинут, как ms one (то есть: вы не можете использовать Convert.ToInt32 в выражении linq). в любом случае, я уверен, что вы можете использовать ВСЕ или ЛЮБОЙ - person frabiacca; 19.04.2011
comment
да, вы можете использовать All и Any, но вы не можете использовать его для объекта вне лямбда (список myStrings в данном случае), с уже существующими объектами в лямбда, например, ссылочная последовательность в объекте Table. - person Femaref; 19.04.2011
comment
@frabiacca - Я только что перешел на HQL. Похоже, что nhibernate linq пока что не умеет этого делать. - person chobo2; 11.05.2011

person    schedule
comment
но разве это не совпадет с частями? Например, если я ищу «5», и у меня есть эти идентификаторы (5 500 100). Разве это не совпадет с 5 и 500? - person chobo2; 19.04.2011
comment
Нет. Он должен искать элементы таблицы с совпадающими идентификаторами в предоставленной коллекции. - person psousa; 19.04.2011
comment
@ chobo2: это должен быть принятый ответ, поскольку он работает так, как вы просили, All(), Any() выдают неподдерживаемое исключение. - person Răzvan Flavius Panda; 19.06.2013