Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ deferred queries / 14 сообщений из 14, страница 1 из 1
18.05.2009, 19:35
    #35992656
umluser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
Есть 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
18.05.2009, 19:51
    #35992674
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
umluser,

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

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

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

Потом я хочу обработать каждый дополнительный атрибут в объекте Document.DocAttributes
в зависимости от его типа и значения и добавить условия Where(...) к исходному запросу.
...
Рейтинг: 0 / 0
18.05.2009, 20:22
    #35992720
D129
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
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
18.05.2009, 20:35
    #35992734
Сансенд
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
Можно еще тут почитать. Тоже неплохой метод, мне понравился)
...
Рейтинг: 0 / 0
18.05.2009, 22:49
    #35992848
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
D129почитайте про динамическое построение запросов. Добавлять условия просто проходя в коде разные участки не получится.

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


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

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

...

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

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

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

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

Модератор: Тема перенесена из форума "C#.NET".
...
Рейтинг: 0 / 0
19.05.2009, 13:44
    #35993999
umluser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
СУМНа кой тут динамический линк?
Делаю фильтры так:
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
19.05.2009, 13:54
    #35994044
buser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
Есть такая фигня как Contains... можно и так попробовать : Dynamically Composing Expression Predicates
...
Рейтинг: 0 / 0
19.05.2009, 14:31
    #35994197
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
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
19.05.2009, 14:52
    #35994274
umluser
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
LINQ deferred queries
зы,

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


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