powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Генератор Linq
14 сообщений из 14, страница 1 из 1
Генератор Linq
    #39015684
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В зависимости от входящих параметров надо формировать разные Linq-запросы.
В SQL делалось все просто, например самый простой вариант:
Код: c#
1.
2.
3.
4.
5.
6.
  //условие по выбранному пользователем полю
  string SQL = "select * from table1 where ";
  if(paramField == 1) SQL += "table1.fieldX=@param"
  else SQL += "table1.fieldY=@param"
  //...
  //и т.д.


Можно что-то подобное организовать в Linq?

П.С. Запросы Очень большие и плодить для каждого параметра отдельный, копируя каждый раз ~95% запроса не вижу смысла.
...
Рейтинг: 0 / 0
Генератор Linq
    #39015705
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
potkin, LINQ использует отложенное исполнение, так что никаких проблем.
Код: c#
1.
2.
3.
var query = context.TableName;
if (paramField == 1) query = query.Where(e => e.FieldX == "smth");
    else query = query.Where(e => e.FieldY == "smth else");
...
Рейтинг: 0 / 0
Генератор Linq
    #39015799
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile
Ну да, слишком лёгкий пример привёл, вопрос в том, можно ли в середину добавить под-запрос?
То есть НЕ в концовку запроса, а в середину запроса?
Типа что-то такого:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
var query1 = 
(
...
);

var query2 = 
(
...
);

var query = 
(
   from t1 in db.Table1
   join ...

   if(param == 1) query1
   else if(param == 2) query2

   group y by t1 into grp
   orderby grp.Key.Name
   select new
   {
     ...
   }

)



Слишком сложные запросы, которые задействую более 10 таблиц с LEFT JOIN, Sum(), Count(), ..., поэтому такой облегчённый вариант привёл.
...
Рейтинг: 0 / 0
Генератор Linq
    #39015808
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче.
Надо забить на так понравившийся мне LINQ query syntax
И юзать LINQ extension methods ...
...
Рейтинг: 0 / 0
Генератор Linq
    #39015827
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
potkinможно ли в середину добавить под-запрос?
Можно и даже если не получится, то наверняка выйдет через Expression Trees.
...
Рейтинг: 0 / 0
Генератор Linq
    #39015847
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LINQ extension methods - не корректно запросы генерит, вернее запрос получается намного боьше по количеству символов, чем у LINQ query syntax , куча вложенный селектов. Тормозит на 2 000 записях!
Перехожу обратно на LINQ query syntax , плевать на дублирования запросов ...
...
Рейтинг: 0 / 0
Генератор Linq
    #39015915
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
надо бы человека просветить, что компилятор превращает LINQ query syntax в LINQ extension methods при компиляции программы. Иными словами LINQ query syntax - это всего лишь сахар. Так чтоpotkin LINQ extension methods - не корректно запросы генерит"вы просто не умеете их готовить" (с)
...
Рейтинг: 0 / 0
Генератор Linq
    #39015945
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, не спорю, надо всё это учить.
Просто query syntax легче для понимания.
Вот, например все тормоза были из-за ... Join и GroupJoin, надо было юзать "GroupJoin".
...
Рейтинг: 0 / 0
Генератор Linq
    #39015957
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати
bazile
Код: c#
1.
2.
3.
    var query = context.TableName;
    if (paramField == 1) query = query.Where(e => e.FieldX == "smth");
    else query = query.Where(e => e.FieldY == "smth else");


Выдаёт ошибку:
Код: plaintext
1.
2.
3.
4.
Ошибка
Неявное преобразование типа 
"System.Linq.IQueryable<UO.Models.Table1>" в "System.Data.Entity.DbSet<UO.Models.Table1s>" невозможно. 
Существует явное преобразование (возможно, отсутствует приведение)	
...
Рейтинг: 0 / 0
Генератор Linq
    #39016022
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Генератор Linq
    #39016060
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Та у меня SQLite ...
...
Рейтинг: 0 / 0
Генератор Linq
    #39016236
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
potkinПросто query syntax легче для понимания.кому как, как выяснилось...
LINQ: кто какой синтаксис использует?
...
Рейтинг: 0 / 0
Генератор Linq
    #39016407
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в SQLite for Linq много глюков (недоработок), например один из них:
APPLY Joins are not supported
Висит ещё с 2011 года, с низким приоритетом "Low", то есть его и не собираются исправлять.

Вот такой элементарный запрос даст ошибку APPLY Joins are not supported :
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
from dirNomenHistory in db.DirNomenHistoryes
.Where
(
  Hist =>
  dirNomen.DirNomenID == Hist.DirNomenID &&
  Hist.DirNomenHistoryDate ==
  (
    from x in db.DirNomenHistoryes
    where x.DirNomenID == dirNomen.DirNomenID && x.DirNomenHistoryDate <= HistoryDate //где "HistoryDate" - параметр типа DateTime
    select x.DirNomenHistoryDate
   ).Max()
)
.DefaultIfEmpty()


Типа вложенный запрос, в котором надо получить: максимальную дату истории цен товара до даты "HistoryDate"

П.С. Хотя может я что-то не понимаю и не правильно делаю ...
...
Рейтинг: 0 / 0
Генератор Linq
    #39017991
Фотография potkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В SQLite to Linq ещё и округление не работает!!!

Пример на Линке:
Код: sql
1.
2.
3.
4.
5.
6.
7.
  
  from ...
  where ...
  select new
  {
      Price = Math.Round(DocX.Price, 2)
  }


Переводит в SQL так:
Код: sql
1.
2.
3.
4.
  
  select ROUND(DocX.Price, 0) AS [C1]
  from ... 
  where ...


Как видим в Линке округление стоит до 2-х циферек после запятой, а в SQL перевело - округление до 0-я
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Генератор Linq
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]