отложено изпълнение на where в sql

имам редактор, където хората могат да създават персонализирани sql заявки. тези заявки са NHibernate.IQuery обекти.

в нашия проект използваме NHibernate.Linq.LinqExtensionMethods.Query, за да получим обект IQueryable, който може да се използва за прилагане на филтри, които се изпълняват отложено (всичко в DB).

сега искам да създам друг филтър, който е базиран на персонализираните sql заявки. това, което искам е нещо подобно:

queryable.Where(x=> <sql-query contains x>)

единственото нещо, което мога да направя в момента, е предварително да изпълня sql-заявката и след това да филтрирам заявката с получения списък от елементи.

IList<T> elements = query.List<T>();
queryable.Where(x => elements.Contains(x)).ToList();

проблемът с този подход е, че списъкът от елементи може да бъде огромен. ако е възможно, бих искал да изпълня целия оператор директно в базата данни, така че да не се налага да прехвърлям всички обекти в моето приложение, след което да изпратя всички обекти обратно в базата данни като филтърни параметри...

редактиране: първата заявка (тази, която дава списъка с елементи за проверка във втората заявка) е конструирана от обикновен sql-низ, както следва:

ISQLQuery sqlQuery = CurrentSession.CreateSQLQuery(myQueryString);//create query
sqlQuery.AddEntity(typeof (T)); //set result type
IQuery query = sqlQuery.SetReadOnly(true);

person r3try    schedule 02.10.2014    source източник


Отговори (1)


Ако имате идентификатори, тогава трябва да ги изберете във вашия query и да го сравните със съответната колона за идентификатори във втората заявка.

var elementIdsToUseInContain = query
    .Select(x => x.YourIdProperty);
var result = queryable
    .Where(x => elementIdsToUseInContain.Contains(x.YourIdPropertyToCompareTo))
    .ToList();

Забележка: Не съм го тествал, но е доста стандартен Linq. Зависи дали NHibernate го поддържа, което не знам.

person Maarten    schedule 02.10.2014
comment
благодаря за отговора, но мисля, че не изясних мнението си. проблемът не е във филтъра в списък с елементи... това е доста ясно. но проблемът ми е, че не искам да изпълнявам списъка с елементи предварително. когато списъкът стане наистина дълъг, има много данни, които трябва да извлека от db и след това да изпратя тези данни отново в db във втората заявка. това, което искам, е да комбинирам двете заявки, така че имам само една заявка (за да сведа до минимум режийните разходи). - person r3try; 02.10.2014
comment
Знам. Моето решение прави това. Променливата elementIdsToUseInContain е заявка, а не резултат от заявката. Ако NHibernate е достатъчно умен, той ще комбинира двете заявки, когато конструира своя SQL. Entity Framework en Linq-to-sql поддържа това. Това ще доведе до един SQL израз (поне с EF и L2S, и да се надяваме, че и с NHibernate). - person Maarten; 02.10.2014
comment
ах добре, не разбрах, че няма toList() в първата част... за съжаление интерфейсът NHibernate.IQuery няма метод за съдържане и по този начин не мога да разбера как да комбинирам IQuery с IQueryable. Проблемът е, че трябва да конструирам първата си заявка от обикновен sql, поради което използвам интерфейса IQuery. - person r3try; 02.10.2014