powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ -в каких случая запрос выполняется на сервере?
19 сообщений из 19, страница 1 из 1
LINQ -в каких случая запрос выполняется на сервере?
    #35135065
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжении вчерашнего открытия состоящего в том что запрос типа
Код: plaintext
1.
2.
query = (from c in query
                         where c.CompanyName.Contains(fotbordoc["CompanyName"].value.ToString())
                         select c).AsQueryable<Customer>();
транслируется в "настоящий"
Код: plaintext
select ... from Customer where CompanyName like @p1
Запрос сделанный с помощью лямбда выражений
Код: plaintext
1.
2.
3.
4.
5.
6.
var query = db.GetCutmors().AsEnumerable();

            foreach (var cond in conditions)
            {
                query = query.Where(filterExpressions[cond.field](cond.value));

            }
это клиентский фильтр! На сервере просто

Код: plaintext
select ... from Customer 
без where! Вопрос когда запрос выполняется на сервере? Это принципиальный момент!
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135090
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты может уже спецификацию почитаешь?
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135124
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НахлобучТы может уже спецификацию почитаешь?
Если не трудно конкретнее! Очень важный момент в контсруировании приложения!
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135173
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это :) можно ставить номер серии этого сериала,а то я иногда попадаю в заблуждение :)
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135175
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill GreatЕсли не трудно конкретнее! Очень важный момент в контсруировании приложения!
Если не трудно, почитайте про Deferred Execution. И про то, что же делает вызов AsEnumerable()
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135224
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нахлобуч
Если не трудно, почитайте про Deferred Execution. И про то, что же делает вызов AsEnumerable()
То есть достаточно поставить AsEnumerable() как получаем всё на клиенте? Сейчас проверим.
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135244
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В одну сторону не верно, то есть если код изменть и написать
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 var query = db.GetCutmors().AsQueryable();

            foreach (var cond in conditions)
            {
                query = query.Where(filterExpressions[cond.field](cond.value)).AsQueryable();

            }
            bindingSource1.DataSource = query;
Всё равно фильтр на клиенте!
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135350
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Безутешный итог таков
Если написать
Код: plaintext
1.
2.
    var query = db.Customers.AsQueryable();
      query = query.Where(c => c.CompanyName.Contains("ch"));
то выполняется на сервере
Код: plaintext
1.
2.
3.
exec sp_executesql N'SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], 
[t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CompanyName] LIKE @p0',N'@p0 nvarchar(4)',@p0=N'%ch%'
Если написать
Код: plaintext
1.
2.
3.
            var query = db.Customers.AsQueryable();
            Func<Customer, bool> searchFilter = delegate(Customer c) { return c.CompanyName.Contains("ch"); };
            query = query.Where(searchFilter).AsQueryable();
Это клиентский фильтр! Где это всё описано?
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135373
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiKэто :) можно ставить номер серии этого сериала,а то я иногда попадаю в заблуждение :)
Я для себя открытия делаю everry day и делюсь ими! Вы всё это уже знаете? Сомневаюсь!
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135781
зы-007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bill GreatБезутешный итог таков
Если написать
Код: plaintext
1.
2.
    var query = db.Customers.AsQueryable();
      query = query.Where(c => c.CompanyName.Contains("ch"));
то выполняется на сервере
Код: plaintext
1.
2.
3.
exec sp_executesql N'SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], 
[t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
FROM [dbo].[Customers] AS [t0]
WHERE [t0].[CompanyName] LIKE @p0',N'@p0 nvarchar(4)',@p0=N'%ch%'
Если написать
Код: plaintext
1.
2.
3.
            var query = db.Customers.AsQueryable();
            Func<Customer, bool> searchFilter = delegate(Customer c) { return c.CompanyName.Contains("ch"); };
            query = query.Where(searchFilter).AsQueryable();
Это клиентский фильтр! Где это всё описано?
Очевидно в первом случае where IQueryable
а во втором IEnumerable
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135906
Гу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bill Great AlexeiKэто :) можно ставить номер серии этого сериала,а то я иногда попадаю в заблуждение :)
Я для себя открытия делаю everry day и делюсь ими! Вы всё это уже знаете? Сомневаюсь!
Лучше книги почитай!
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35135921
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как же написать expression что бы было IQueryable?

Код: plaintext
1.
 
Func<Customer, bool> searchFilter = delegate(Customer c) { return c.CompanyName.Contains("ch"); };
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35136073
Гу
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bill Greatкак же написать expression что бы было IQueryable?

Код: plaintext
1.
 
Func<Customer, bool> searchFilter = delegate(Customer c) { return c.CompanyName.Contains("ch"); };

Пиши
Код: plaintext
Expression<Func<Customer, bool>> serverfilter = c => c.CompanyName.Contains("ch");   
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35136109
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гу
Пиши
Код: plaintext
Expression<Func<Customer, bool>> serverfilter = c => c.CompanyName.Contains("ch");   


Спасибо! Итак словарик действий (выполняющихся на сервере!) выглядит так
Код: plaintext
1.
2.
3.
4.
5.
6.
Dictionary<string, Func<object, Expression<Func<Customer, bool>>>> filterExpressions =
    new Dictionary<string, Func<object, Expression<Func<Customer, bool>>>>() 
{
	{"CompanyName", (p) => ((customer) => customer.CompanyName.Contains( p.ToString()))},
	{"ContactName", (p) => ((customer) => customer.ContactName.Contains(p.ToString()))},
	{"Country", (p) => ((customer) => customer.Country.Contains( p.ToString()))}
};
Употребление простое. Есть класс текущего отбор (пишем самую простую реализацию)
Код: plaintext
1.
2.
3.
4.
5.
 public class filt_field
        {
            public string field { get; set; }
            public string value { get; set; }
        }
public List<filt_field> conditions = new List<filt_field>();
Ввод пользователя загоняем в conditions типа
Код: plaintext
1.
2.
3.
 conditions.Clear();
if (textBox1.Text.Trim() != String.Empty)
                conditions.Add(new filt_field { field = "CompanyName", value = textBox1.Text });
Чтение реестра
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
 void ReadDoc()
        {
            var query = db.Customers.AsQueryable();            
            foreach (var cond in conditions)
            {
                query = query.Where(filterExpressions[cond.field](cond.value)).AsQueryable();

            }
            bindingSource1.DataSource = query;

        }
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35136178
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин, пока меня не было и пока я дочитывал и дописывал первую серию, во второй уже все разжевали :) ну ладно :)
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35138269
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыблин, пока меня не было и пока я дочитывал и дописывал первую серию, во второй уже все разжевали :) ну ладно :)
однако удобней не стало по сравнению с записью
(from c in query
where c.CompanyName.Contains(fotbordoc["CompanyName"].value.ToString())
select c).AsQueryable<Customer>();

Мы нечего не выйграли! Казхалось бы произошло разделение на данные ( значение отбора) и действие ( словарик действий), но реально какую FUNC применять знает отбор. Например - пользователь может выбрать отбор по названию и указать способ - точное совпадение, по началу и т.д. Или отбор по данной колонке может быть типа интервала @p1<= field <@p2! Это означает смесь отбора и действия! Возможно ли это сделать при помощи словарика? ТО есть что то типа
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Dictionary<string, Func<object, Expression<Func<Customer, bool>>>> filterExpressions =
    new Dictionary<string, Func<object, Expression<Func<Customer, bool>>>>() 
{
	{"CompanyName", (p) => ({(customer) => 
if (p.TypeOtborLike) // отбор типа like
customer.CompanyName.Contains( p.ToString()))
else if ((p.TypeEqul) // отбор типа точное совпадениеп
customer.CompanyName== p.ToString())
// и так далее
}},
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35138787
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я тебе всего-лишь показал, как можно упростить сложную структуру условий и ветвлений используя простой словарь действий. Мы выиграли в читабельности и компактности кода, а так же простоте поддержки. Хочешь ветвления - можешь добавить второй уровень. Если ветвления только для нескольких колонок, можешь писать через ?
p=> p.EqType==EqType.Like ? customer.Contains(p.Value) : customer==p.Value

можешь идти дальше и реализовать мини-фабрику Expressions и составлять их находу, тогда можно будет почти избежать ветвлений логики и т.п.

способов дофига, главное выбрать правильный.
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35138859
Фотография Нахлобуч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great
Нуу все. Дали человеку в руки молоток, теперь везде гвозди мерещатся.
...
Рейтинг: 0 / 0
LINQ -в каких случая запрос выполняется на сервере?
    #35138971
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыя тебе всего-лишь показал, как можно упростить сложную структуру условий и ветвлений используя простой словарь действий. Мы выиграли в читабельности и компактности кода, а так же простоте поддержки. Хочешь ветвления - можешь добавить второй уровень. Если ветвления только для нескольких колонок, можешь писать через ?
p=> p.EqType==EqType.Like ? customer.Contains(p.Value) : customer==p.Value

можешь идти дальше и реализовать мини-фабрику Expressions и составлять их находу, тогда можно будет почти избежать ветвлений логики и т.п.

способов дофига, главное выбрать правильный.
Про мини-фабрику Expressions где бы почитать? А может она формироваться в run time пользователем?
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ -в каких случая запрос выполняется на сервере?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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