powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - строим отборы
25 сообщений из 29, страница 1 из 2
LINQ - строим отборы
    #35089544
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем! Как правильно построить отборы на основе linq? Пользователь вводит значения полей по которым хочет отобрать и программно создаётся запрос LINQ. Берём таблица Orders из стандартного примера. Создаём
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// Отбор по одной колнке
 class otbor
        {
            public string columnname { get; set; } // название колонки
            public bool active { get; set; } // включён отбор
            public object value { get; set; } // значение отбор
            public object value1 { get; set; } // значение отбор
        }
В обработчике включения отборов
Код: plaintext
1.
2.
3.
4.
5.
ListOtbor.Clear();
            ListOtbor.Add(new otbor { columnname = "CustomerID", active = ch_CustomerID.Checked, value = textBox_CustomerID.Text });
            ListOtbor.Add(new otbor { columnname = "OrderDate", active = ch_OrderDate.Checked, value = OrderDate_dateTimePicker.Value.Date });
            ListOtbor.Add(new otbor { columnname = "ShipName", active = ch_ShipName.Checked, value = textBox_ShipName.Text });

И главный цикл
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  var result = from c in db.Orders
                         select c; 
            foreach (otbor item in ListOtbor)
            {              
                if (item.active)
                {
                    if (item.columnname == "OrderDate")
                        result = (from c in query
                                  where c.OrderDate == (DateTime)item.value
                                  select c).AsQueryable<Order>();
                    else if (item.columnname == "CustomerID")
                        result = (from c in query
                                  where c.CustomerID == item.value.ToString()
                                  select c).AsQueryable<Order>();
                    else if (item.columnname == "ShipName")
                        result = (from c in query
                                  where c.CustomerID == item.value.ToString()
                                  select c).AsQueryable<Order>();
                }
            }
Подключаем
bindingSource2.DataSource = result;
В Profiler видно что параметры не присвоились! Чего делать?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35089555
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В предудушем при мере если глянут ь в Profiler то видно что

Код: plaintext
1.
2.
3.
4.
5.
exec sp_executesql N'SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredDate], [t0].[ShippedDate], 
[t0].[ShipVia], [t0].[Freight], [t0].[ShipName], [t0].[ShipAddress], [t0].[ShipCity], [t0].[ShipRegion], [t0].[ShipPostalCode], [t0].[ShipCountry]
FROM [dbo].[Orders] AS [t0]
WHERE [t0].[CustomerID] = @p0',N'@p0 nvarchar(5)',@p0=N''

Значение параметра отбора пустое! Хотя в ListOtbor[0].value.ToString() значение введено!
Вместо цикла foreach расписываем подряд
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 if (ListOtbor[ 0 ].active)   
                  result = (from c in query
                                  where c.CustomerID == ListOtbor[ 0 ].value.ToString()
                                  select c).AsQueryable<Order>();
            if (ListOtbor[ 1 ].active)  
                        result = (from c in query
                                  where c.OrderDate == (DateTime)ListOtbor[ 1 ].value
                                  select c).AsQueryable<Order>();
            if (ListOtbor[ 2 ].active)  
                        result = (from c in query
                                  where c.CustomerID == ListOtbor[ 2 ].value.ToString()
                                  select c).AsQueryable<Order>();
             bindingSource2.DataSource = result;

Параметры присвоились! Почему в цикле не присвавиваются?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35089926
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вообще плохо понял что ты там написал, эта чушь по определению даже компилироваться не могла.
ты в цикле присваивал разные запросы одной и той же переменной, что должно было получиться?
что такое .AsQueryable<Order>(); ??
в цикле не получается потому что ты ссылаешься на item,который в процессе цикла изменяется. А поскольку выполнение LINQ запроса отложенное, то item вероятней всего будет иметь последнее значение из цикла
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091201
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыя вообще плохо понял что ты там написал, эта чушь по определению даже компилироваться не могла.
ты в цикле присваивал разные запросы одной и той же переменной, что должно было получиться?
что такое .AsQueryable<Order>(); ??

всё компилируется!

зы
в цикле не получается потому что ты ссылаешься на item,который в процессе цикла изменяется. А поскольку выполнение LINQ запроса отложенное, то item вероятней всего будет иметь последнее значение из цикла
Конечно именно так - linq defereded! И это открывает любопытные возможности можно можно постепено набирать нужный запрос типа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
var result = (from c in query
                                  where c.CustomerID == ListOtbor[ 0 ].value.ToString()
                                  select c)
var q = (
                     from c in result 
                     select c.Country
                    ).Union(
                     from e in db.Employees
                     select e.Country
                    );


...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091378
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так ты все-таки что-то спросить хотел?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091396
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зытак ты все-таки что-то спросить хотел?
При всём удобстве такого пошагового набора не навернёт ли себе голову linq

Умеет ли LINQ исрользовать MARS conection?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091487
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great зытак ты все-таки что-то спросить хотел?
При всём удобстве такого пошагового набора не навернёт ли себе голову linq



да:) навернет себе голову не linq,а Вы :)
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091720
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeiK
да:) навернет себе голову не linq,а Вы :)
Напротив! реализовал отборы как цепочку linq выражений- удобно необыкновенно! Единственное не получается как обновлять матер детальную связь?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091739
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не найду аналог TableNewRow? что бы вставлять значения по умолчанию
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091776
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я боюсь пользоваться его программами....

авторНе найду аналог TableNewRow? что бы вставлять значения по умолчанию
new EntityName()
context.Entities.InsertOnSubmit(myNewEntity);
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091888
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыя боюсь пользоваться его программами....

Новая залепуха.
Оказывается вот так писать МОЖНО
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
            var query = from c in db.Dogovors
                        join mo in db.MyOrgs on c.dg_mo_id equals mo.mo_id                        
                        select new Dogovor
                        {
                            dg_id = c.dg_id,
                            dg_num = c.dg_num,
                            dg_descr = c.dg_descr,
                        };
            bindingSource1.DataSource = query;

Оказывается вот так писать НЕЛЬЗЯ

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
            var query = from c in db.Dogovors
                        join mo in db.MyOrgs on c.dg_mo_id equals mo.mo_id                        
                        select new Dogovor
                        {
                            dg_id = c.dg_id,
                            dg_num = c.dg_num,
                            dg_descr = c.dg_descr,
                        };
            bindingSource1.RaiseListChangedEvents = false; // ДОБАВЛЕНО 
            bindingSource1.DataSource = query;
            bindingSource1.RaiseListChangedEvents = true; // ДОБАВЛЕНО
            bindingSource1.ResetBindings(false); // ДОБАВЛЕНО
Возникает исключение!
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091934
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я, конечно, не занимаюсь винформами, но тебе, возможно, полезно будет
http://paulstovell.net/blog/index.php/introducing-synclinq/
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35091936
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оказывается теперь это не нужно! Мастер детальное чтение не конфликтует!
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092021
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill GreatОказывается теперь это не нужно! Мастер детальное чтение не конфликтует!

Билли, напишите книгу. Я первый куплю, хоть лет 1.... уже не покупал не одной. :)
Назовите "Действие Линк на неокрепшие мозги". ШУЧУ. :):):)
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092052
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыя, конечно, не занимаюсь винформами, но тебе, возможно, полезно будет
http://paulstovell.net/blog/index.php/introducing-synclinq/
За ссылку спасибо, почему я, конечно, не занимаюсь винформами Это в каком смысле?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092075
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават Юсифов[
Билли, напишите книгу. Я первый куплю, хоть лет 1.... уже не покупал не одной. :)
Назовите "Действие Линк на неокрепшие мозги". ШУЧУ. :):):)
Сахават! Присоединяйся! Я делюсь опытом, так linq очень клёвая вещичка! Но требует некоего навыка+ знание, как и любая технология, всяких залепух. Кто бы мог подумать что при мастер-детальном чтение не надо "блокировать" астер стандартными способом
Код: plaintext
1.
2.
3.
4.
             
            bindingSource1.RaiseListChangedEvents = false; // ДОБАВЛЕНО 
            bindingSource1.DataSource = query;
            bindingSource1.RaiseListChangedEvents = true; // ДОБАВЛЕНО
            bindingSource1.ResetBindings(false); // ДОБАВЛЕНО
что у неё reader on readr не наезжает! интересно а чем ОНО читает?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092106
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы
http://paulstovell.net/blog/index.php/introducing-synclinq/
Ссылка не действительна! А жаль!
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092158
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыя боюсь пользоваться его программами....

авторНе найду аналог TableNewRow? что бы вставлять значения по умолчанию
new EntityName()
context.Entities.InsertOnSubmit(myNewEntity);
У Table<(Of <(TEntity>)>) НЕТ СОБЫТИЙ это плохо или я что то не понял?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092159
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
погугли
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092163
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great
У Table<(Of <(TEntity>)>) НЕТ СОБЫТИЙ это плохо или я что то не понял?
ты начинаешь раздражать своей нелепой безграмотностью. каких нафиг событий?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092341
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы
ты начинаешь раздражать своей нелепой безграмотностью. каких нафиг событий?
Давайте снисходительно относиться к друг к другу. Возьмите статью LINQ to SQL's WinForms Databinding Story
там можно увидеть что
The timing of Young Joo's coverage of databinding a two-level hierarchy is as follows:

1. 16:00 He adds a new Data Source from a DataContext's Customer entity.
и т.д.
Теперь по делу
Событиями являются partial method скажем то что было OnNewRow - это OnCreate() и т.д.
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092550
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават Юсифов
Билли, напишите книгу.Действие Линк на неокрепшие мозги
Сахават! А ты знал что при заполнение мастер-детальной формы у которой по событию
Код: plaintext
masterbindingsource.onCurrebtChange 

заполняется детальная часть не надо "блокировать" мастер?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092567
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great Сахават Юсифов
Билли, напишите книгу.Действие Линк на неокрепшие мозги
Сахават! А ты знал что при заполнение мастер-детальной формы у которой по событию
Код: plaintext
masterbindingsource.onCurrebtChange 

заполняется детальная часть не надо "блокировать" мастер?
Нет, конечно.
А зачем ее надобыло "блокировать"?
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092580
AlexeiK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bill Great
ну как еще голову не навернул? :)
...
Рейтинг: 0 / 0
LINQ - строим отборы
    #35092601
Bill Great
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават Юсифов
А зачем ее надобыло "блокировать"?
При заполнении датасетов используется DataReader и так как он может быть один пока мастер целиком не прочитался OnCurrentChanche должен не срабатывать (что бы не запустился datareader детальной части) Обычное решение

Код: plaintext
1.
2.
3.
4.
MasterbindingSource.RaiseListChangedEvents = false;
Adapter.Fill(MasterTable)
MasterbindingSource.RaiseListChangedEvents = true; 
MasterbindingSource.ResetBindings(false);
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - строим отборы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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