Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Новый топик    Ответить
 Linq запрос по двум источникам данных  [new]
bormental
Member

Откуда:
Сообщений: 90
Есть ,скажем так ,два source с данными :

1. var colguid = new List<Guid>();
в котором несколько десятков тысяч ...

2. var rLists =
(IQueryable<Qwerty>)new XPQuery<Qwerty>(session); // примочка от DevExpress


Не могу что то соображить как организовать linq -запрос между двумя этими наборами данных (
Суть в том, чтобы написать select который будет ограничивать rLists только теми записями которые есть в коллекции colguid

пробовал так :

var rData = rLists
.OrderBy(el => el.Исполнитель.Код)
.Where(el => colguid.Contains(el.Oid )) //если ли el.Oid внутри colguid ?
.Where(el => el.Исполнитель !=null)
.Select.....

но напоролся на то что при выполнении так нельзя : el => colguid.Contains(el.Oid ) интерпретируется в кучу параметров и там их больше чем 2 с небольшим тыщи не может быть в LINQ ((
Прошу помочь с решением оптимальным (может заJOIN-нить как то между собой в запросе эти два набора данных ? не получается это сделать тоже - не пойму что написать на ключе внешнем у colguid )

p.s. c LINQ знаком поверхностно (
22 окт 13, 18:01    [15016654]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
недавно такое обсуждали, оптимальное решение
22 окт 13, 21:52    [15017458]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
bormental
Member

Откуда:
Сообщений: 90
LR,

Спасибо...да, с листами работает.
А в моем варианте что то нет. Попробовал :

var rData = rLists
.OrderBy(el => el.Исполнитель.Код)
.Where( el => colguid.Exists(xx => xx == el.Oid))
.Where(el => el.Исполнитель !=null)
.Select.....


все компиляется, но при выполнении говорят что указанный метод не поддерживается ...
24 окт 13, 11:06    [15024743]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
bormental
Member

Откуда:
Сообщений: 90
LR,

попробовал join простой

var rData = from c in rLists
join c2 in colguid
on c.Oid equals c2
select c;

а так при выполнении получаю :
"Ссылка на объект не указывает на экземпляр объекта."
24 окт 13, 11:33    [15024963]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
LR
Member

Откуда: 8P8C
Сообщений: 2423
bormental,

IQueryable : IEnumerable, поэтому не должно быть никаких проблем...

var rData = rLists.Join(colguid, a => a.Oid, b => b, (a, b) => a)
?
24 окт 13, 17:26    [15027868]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
bormental
Member

Откуда:
Сообщений: 90
LR,

Верно, Интерфейс IQueryable наследует интерфейс IEnumerable. Но проблема имеет место почему то быть..

Вычитал в книжке одной следующее :
автор
Для обращения к источнику данных по запросу, формированному средствами LINQ, в этом источнике данных должен быть реализован интерфейс IEnumerable. Он имеет две формы обобщенную и необобщенную. Как правило, работать с источником данных легче, если в нем реализуется обобщенная форма IEnumerable<T>.....Тип переменной диапозона должен соответствовать типу элементов, хранящихся в источнике данных. Следовательно, тип переменной диапозона зависит от типа источника данных. Как правило, тип переменной диапазона может быть выведен средствами C#. Но выводимость типов м.б. осуществлена при условии, что в источнике данных реализована форма интерфейса IEnumerable<T>. Но если в источнике данных реализован необобщенный вариант интерфейса IEnumerable, то тип переменной диапозона придется указывать явно. И это делается в операторе from

как я понимаю, IQueryable и есть необощенный вариант интерфейса IEnumerable ?

Если приводить непосредственно в linq-запросе rLists к Enumerable вот так :

var repairListsData = repairLists.AsEnumerable().Join(colguid, a => a.Oid, b => b, (a, b) => a);

то пропадает исключение "Ссылка на объект не указывает на экземпляр объекта." , если без AsEnumerable, то выкидывает исключение такое предложение. Но все равно, когда с AsEnumerable то что то не работает (jpg прилагаю что кажет...)

Позволю себе еще подробнее привести код colguid(но вроде он сразу IEnumerable, т.к. он List ) :

Guid curGuid;
var colguid = new List<Guid>();
foreach(var pl in documentOids2)
{
curGuid=(Guid)pl.GetValue(0);
colguid.Add(curGuid);
}
24 окт 13, 20:26    [15028605]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
bormental
Member

Откуда:
Сообщений: 90


К сообщению приложен файл. Размер - 113Kb
24 окт 13, 20:29    [15028614]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
bormental,
ты исходи из того, что одно перечисление у тебя локально ( несколько десятков тысяч ) а другое на сервер которое надо вытащить
согласно локальному перечислению.
и каково же вида должен быть запрос?
24 окт 13, 20:55    [15028701]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
мне вот просто интересно, откуда эти данные взялись локально, или их пользователь набил в ручную, или пришли через soa или
вы их с хранилища вытащили?
24 окт 13, 21:02    [15028733]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
bormental
Member

Откуда:
Сообщений: 90
Где-то в степи,
Ага..они предварительно вытащены из БД и сохранены в List

автор
ты исходи из того, что одно перечисление у тебя локально ( несколько десятков тысяч ) а другое на сервер которое надо вытащить
согласно локальному перечислению.
и каково же вида должен быть запрос?


не понимаю, наверное, к чему Вы клоните... да, хочется, как я и грил открывая тему, ограничить получаемый набор данных с сервера БД этим локальным перечислением. Я многого хочу ? LINQ такое не умеет ? Вроде как в качестве data-source в соответствующей части конструкции linq-запроса может быть все вплоть до обычного массива...
24 окт 13, 23:10    [15029103]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
bormental,
ограничить?, а как будет выглядеть запрос sql с несколько десятками тысяч параметров ?
можно конечно бла бла.ToLost().Join - но если на локали несколько десятков тысяч то в листе окажется десятки сотен тысяч,
а клоню я к тому, что смысл тащить на клиента в таких межгалактических расчетах этот лист, задача решается индексами
и хранимой процедурой на сервере, он и заточен под это...
24 окт 13, 23:34    [15029167]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
bormental
Member

Откуда:
Сообщений: 90
Где-то в степи,

Спасибо. Хреново если так...Я тут, видимо наивно, полагал что LINQ вытянешь из первого источника данные на клиента и пофильтрует на нем уже ) А сохранять в List конечно совсем не гуд данные первого источника. Интересно, а тут кто с XAF от DevExpress развлекался есть народ..
25 окт 13, 09:56    [15029854]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
bormental
Member

Откуда:
Сообщений: 90
Спрошу здесь опять..чтоб топик не создавать.

почему когда используешь LINQ, где в качестве источника выступает множество, в котором есть поле null, то в дальнешем(когда в linq по этому полю расписано некое условие...), при обращении к описанному LINQ-выражению огребаешь ошибку всегда аля ""ссылка не указывает на ....". Если готовишь в качестве истоника для линк запроса результат от того же SQL сервера - то вполне в резалтсете от него может прийти Null в какой то поле.


т.е. вот так приходиться делать :

   var c1 = from c in colguid
                      group c by new
                     {
                         Level4 = c.StRas == null ? "":
                             ( (c.StRas).IndexOf("Кап. ремонт оборудов.")>= 0 || (c.StRas).IndexOf("Тек. ремонт оборудов.")>= 0) ? "Оборудование" :
                             (
                               (c.StRas).IndexOf("Кап. ремонт зданий")>=0 ? "Здания и сооружения" : "хз что за зверь"
                             )
                     .....


если же сделать так :

  var c1 = from c in colguid
                      group c by new
                     {
                         Level4 =( (c.StRas).IndexOf("Кап. ремонт оборудов.")>= 0 || (c.StRas).IndexOf("Тек. ремонт оборудов.")>= 0) ? "Оборудование" :
                             (
                               (c.StRas).IndexOf("Кап. ремонт зданий")>=0 ? "Здания и сооружения" : "хз что за зверь"
                             )
                     .....

то с ошибкой будет такой запрос выполнен.
6 дек 13, 12:35    [15252085]     Ответить | Цитировать Сообщить модератору
 Re: Linq запрос по двум источникам данных  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4328
bormental,
Вы что, пошутили?
Пошучу и я:
Null - это как бы нифуя, нифуя тоже результат, если десять нифуя - уже что то, прально?
А если с этим одним нифуя приходится как то поработать, спросить к примеру что он содержит, естественно исполняемый код визжит
что его пытаются обмануть
6 дек 13, 14:34    [15253265]     Ответить | Цитировать Сообщить модератору
Все форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM Ответить