Динамический LINQ - динамический, на стороне сервера, где пункт - PullRequest
1 голос
/ 03 января 2011

Я читал о динамических LINQ и построителях предикатов. Я немного неясен и немного запутан в части бэкэнд-логистики. Я пытаюсь предложить вариант отчетов / расширенного поиска для одного из моих приложений, включая неприятный запрос groupwise-max.

Я могу легко собрать это вместе для программной фильтрации результатов, но из соображений производительности я бы предпочел, чтобы предложение where выполнялось на сервере SQL, а не в коде .net. Я не уверен, какие решения на самом деле выполняют предикаты в SQL, а не на стороне клиента / .NET. Вот пример того, что я хотел бы сделать с LINQ:

from fbd in db.FooBarDatas
join max_fbd in
    (from fbd in db.FooBarDatas
     group fbd by new { fbd.FooID, fbd.BarID } into grp
     select new { MaxFooBarDataID = grp.Max(fbd => fbd.FooBarDataID }
    )
on fbd.FooBarDataID equals max_fbd.MaxFooBarDataID
select new
{
    FooBarDataID = fbd.FooBarDataID,
    NormalizedPropertyName1 = fbd.Column1,
    NormalizedPropertyName2 = fbd.Column2,
    NormalizedPropertyName3 = fbd.Column3,
    etc...
}

Так что это мой основной запрос. В конце я добавляю их все в объект данных общей ссылки, потому что многие данные, которые я хочу динамически извлечь из запроса, поступают из внешних таблиц, и я хочу, чтобы на них все ссылались как на прямые свойства.

Теперь я хочу, чтобы я мог добавить к этому запросу целую кучу условий предложения where для генерации значимого отчета. Предложение where будет отличаться в зависимости от параметров, заданных пользователем. Набор записей довольно большой, поэтому, опять же, я ищу способ выполнить фильтрацию на стороне SQL.

Может ли кто-нибудь привести простой пример того, как этого можно достичь? Заранее спасибо за любую помощь.

1 Ответ

1 голос
/ 06 января 2011

Я полагаю, что нашел ответ после того, как наткнулся на довольно странное название статьи.

http://www.weirdlover.com/2010/05/11/iqueryable-can-kill-your-dog-steal-your-wife-kill-your-will-to-live-etc/

Похоже, что IQueryable фактически не выполняет какой-либо фактической компиляции TSQL, пока не будет запрошен итератор. Вот очень простой пример:

// this does not actually call a TSQL query
IQueryable<FooBar> q = (from fb in db.FooBars select fb);
// this line still does not call a TSQL query
q = q.Where(fb => fb.FooID == 3);
// this line still does not call a TSQL query
q = q.Where(fb => fb.BarID == 74)
// this line finally compiles a TSQL statement, calls the query, and
// gathers the results:
List<FooBar> results = q.ToList();

объект IQueryable является объектом оценки по требованию. Попробовав это, я обнаружил, что некоторые довольно сложные заявления, распространенные в UDF, возвращались почти мгновенно. Другая статья, которая объясняет разницу между этой и серверной фильтрацией, может быть найдена здесь:

http://www.sellsbrothers.com/posts/details/12614

Я надеюсь, что это поможет любому, кто хочет делать то, что делал я.

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