powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ deferred queries
14 сообщений из 14, страница 1 из 1
LINQ deferred queries
    #35992656
umluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть DataContext.
Есть запрос типа
Код: plaintext
1.
var q = from d in ddc.documents
select d

Далее идут несколько уточнений типа
Код: plaintext
1.
2.
q = q.Where(...)
...
...

Потом идёт следующий цикл:
Код: plaintext
1.
foreach (KindAttribute ka in SearchList.DocAttributes)
{...
в котором я уточняю запрос, посредством добавления новых where clauses, используя объект ka .

Затем я хочу обратиться к базе данных и забрать необходимые мне элементы посредством
Код: plaintext
foreach(var x in q)

НО данные мне не возвращаются.

Если же я в цикле в WHERE запросе вручную укажу ID моего объекта, то данные мне вернутся.
Я предполагаю, что т.к. LINQ запрос - отложенный, то в цикле, указывая COLUMN_ID=myObject.ID (где myObject - итеративный объект), при получении данных я уже потеряю контекст данного объекта.

Я пробовал делать цикл for(int i = ....) Но я ловил исключение, что данного индекса в коллекции не существует, что даёт мне предпосылки предполагать что LINQ не сохраняет ЗНАЧЕНИЕ, а лишь ССЫЛКУ на него, т.е. каждый раз запрашивает myObject.ID, которого уже нету в данном контексте.

Буду благодарен дельному совету.
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35992674
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umluser,

почитайте про динамическое построение запросов. Добавлять условия просто проходя в коде разные участки не получится.

Надо динамически построит LINQ запрос, а потом его вызвать. Класс System.Linq.Expressions.Expression
смотрите.
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35992679
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umluser,
Может быть вас выручит вложенный запрос...
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35992686
umluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129,
чтобы яснее обрисовать ситуацию...
Нужно организовать поиск/фильтр по документам.

Есть структурка типа Document, в ней присутствуют некоторые основные параметры документа,
которые я ищу в 1й части запроса, добавляя q = q.Where(...) к нему.

Потом я хочу обработать каждый дополнительный атрибут в объекте Document.DocAttributes
в зависимости от его типа и значения и добавить условия Where(...) к исходному запросу.
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35992720
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umluser
Ну да, динамическое построение запроса.
вот такой штукой я пользуюсь для поиска в одноуровневом списке.

При использовании обертки:


Код: plaintext
1.
2.
3.
4.
5.
6.
detailMessFromSite = (MessagesDictionaryDetailsEntity)GetBy("HeaderID = @0 && Language = @1", detailMessEntity.HeaderID, detailMessEntity.Language).FirstOrDefault();


public override List<BaseEntity> GetBy(string paramString, params object[] paramValues)
{
	return DynamicQueryable.Where(SingletoneSite.Contents.AsQueryable(), paramString, paramValues).Cast<WhBaseEntity>().ToList();
}
в принципе, больше ничего не надо.
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35992734
Сансенд
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно еще тут почитать. Тоже неплохой метод, мне понравился)
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35992848
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129почитайте про динамическое построение запросов. Добавлять условия просто проходя в коде разные участки не получится.

это ещё почему? а у меня получается, знаешь ли


а мысль автора я что-то ниасилил
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35993080
Фотография СУМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На кой тут динамический линк?
Делаю фильтры так:
if (условие)
{
q = q.Where(условие запроса);
}
if (условие2)
{
q = q.Where(условие запроса 2);
}
...

Тем самым мы к квери накладываем несколько условий в зависимости от выбранного пользователем фильтра.
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35993219
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СУМНа кой тут динамический линк?
Делаю фильтры так:

...

Тем самым мы к квери накладываем несколько условий в зависимости от выбранного пользователем фильтра.

Ну, это понятно. Я так начал делать даже не подумав - это просто разделение запроса на части.
А у меня непосредственный начальник - SQL-щик, и мы с ним долго спорили на тему, что не стоит все пихать в один запрос. И главный его аргумент был - а что, тебе слабо в один запрос все сделать?

Вот я и начал углубляться.
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35993238
Фотография СУМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129
Вот я и начал углубляться.
Данатас, советую курить динамик линк только в экстренных случаях - низкая производительность запроса (смотрим план выполнения) и когда силами Linq просто невозможно решить задачу.
А на банальных выборках с фильтрами, сортировкой, джойнами и прочей ерундой - всё решается намного проще. Хардкод - зло

P.S. А насяльника - фтопку, так и передайте ))

Модератор: Тема перенесена из форума "C#.NET".
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35993999
umluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
СУМНа кой тут динамический линк?
Делаю фильтры так:
if (условие)
{
q = q.Where(условие запроса);
}
if (условие2)
{
q = q.Where(условие запроса 2);
}
...

Тем самым мы к квери накладываем несколько условий в зависимости от выбранного пользователем фильтра.

Я так и делаю, когда обрабатываю ОСНОВНЫЕ атрибуты документа.
т.е.типа q = q.Where(blah=>blah.doc_number.Contains("666"));

Проблема в том, что условия на дополнительные атрибуты у меня добавляются в цикле for или foreach, например q = q.Where(docattr=>docattr.kattr_id.Equals(someList[i].AttrID));
А когда настаёт черед считывания данных, то используется НЕ значение someList[i], которое было передано в цикле, а ТЕКУЩЕЕ значение someList[i].AttrID
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35994044
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть такая фигня как Contains... можно и так попробовать : Dynamically Composing Expression Predicates
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35994197
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
umluser
Проблема в том, что условия на дополнительные атрибуты у меня добавляются в цикле for или foreach, например q = q.Where(docattr=>docattr.kattr_id.Equals(someList[i].AttrID));
А когда настаёт черед считывания данных, то используется НЕ значение someList[i], которое было передано в цикле, а ТЕКУЩЕЕ значение someList[i].AttrID
не слушай тупые советы, а свой вопрос нужно было начинать сразу с этой фразы.

вначале прочитай про лямбда-выражения и замыкания , потом пиши так:
Код: plaintext
1.
var attrID = someList[i].AttrID;
q = q.Where(docattr=>docattr.kattr_id.Equals(attrID));
...
Рейтинг: 0 / 0
LINQ deferred queries
    #35994274
umluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
зы,

именно это и было нужно! Всё работает, огромное спасибо за сохранённые нервы! :)
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ deferred queries
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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