Добавяне на динамична SQL заявка към QueryOver

Имам следната заявка, която работи за мен:

IList<info> result = 
QueryOver<info>()
.Where(row => row.Timestamp >= fromDate)
.And(row => row.Timestamp <= toDate)
.OrderBy(row => row.Timestamp).Asc
.Skip(startRow).Take(count).List();

Трябва да го разширя, като получа от клиент допълнителен низ за SQL заявка и го добавя към моята заявка, както следва:

    IList<info> result = 
        QueryOver<info>()
        .Where(row => row.Timestamp >= fromDate)
        .And(queryString)
        .And(row => row.Timestamp <= toDate)
        .OrderBy(row => row.Timestamp).Asc
        .Skip(startRow).Take(count).List();

string queryString = "AND name='haim' And number=1"

Възможно ли е да добавите QueryOver динамичен низ за заявка?


person Haimon    schedule 21.04.2013    source източник
comment
Защо искате да направите това?   -  person Phill    schedule 21.04.2013


Отговори (3)


Съмнявам се, че това е възможно извън кутията. Но с известна настройка можете да направите това

  1. Извадете SQL от вашия QueryOver<>. Следвайте приетия отговор на този въпрос
  2. Свържете това с вашия sql, изпратен от клиента
  3. Използвайте NH, за да стартирате обикновения SQL. Вижте приетия отговор на този въпрос как да направите това
person Suhas    schedule 21.04.2013

Краткият отговор е, че можете:

string queryString = "name='haim' And number=1";
var query = Session.QueryOver<info>().And(NHibernate.Criterion.Expression.Sql(queryString));

докато поддържате инжектираните queryStrings кратки и прости, ще бъдете добре. Ако искате този инжектиран низ също да промени семантиката на заявката (като например да изисква присъединяване), бих ви посъветвал да не го правите; не си струва да се мъчите.

person Jaguar    schedule 22.03.2014

Тук бих добавил, че не е добра практика sql да се генерира някъде другаде и да се изпраща за изпълнение. Знам, че може да е трудно да се абстрахират сценариите WHERE в класове, но с NET4 е много по-бързо да се направи с динамични класове.

Затова казвам, че това е лоша практика, защото не капсулирате заявката си в един слой. Ти трябва.

Ужасното последствие очевидно е липсата на силна връзка между двете части, което прави това решение много крехко. Ако едното се промени, трябва да сте наясно, че другото трябва да се актуализира и т.н. Един или два екипа за разработчици са добре, но големите екипи ще бъдат наранени от това.

Само моите два цента.

person Kat Lim Ruiz    schedule 21.03.2014