Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
 Аватар для GrafikRem
0 / 0 / 1
Регистрация: 28.11.2015
Сообщений: 53

Вложенный Linq лямбда не работает

02.07.2018, 17:19. Показов 3595. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вложенный Linq лямбда не работает. Когда вытаскиваю внутренний запрос за пределы наружной лямбды все хорошо..
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        private static Dictionary<string, Dictionary<string, DateTime>> GetImagesInfoFromDb()
        {
            using (var session = DbImages.OpenSession())
            using (var trans = session.BeginTransaction())
            {
                var models = session.Query<Models>().ToList();
 
                var test = models.Where(y => y.Id == 2).Select(z=>z.Name).FirstOrDefault(); //работает!!
                
                
                var modificationsImages = session.Query<ModificationsImages>()
                    .Select(x => new
                    {
                        id = x.Id,
                        name = x.Name,
                        parentId = x.ParentId,
                        parentName = models.Where(y => y.Id == 2).Select(z=>z.Name).FirstOrDefault(), //НЕ работает..
                                                                                            //выдает ошибку
                        dateWrite = x.DateWrite
                    })
                    .ToList();
            }
System.NotSupportedException: Specified method is not supported.
at at NHibernate.Hql.Ast.ANTLR.PolymorphicQuer ySourceDetector.GetClassName(IASTNode querySource)
at at NHibernate.Hql.Ast.ANTLR.PolymorphicQuer ySourceDetector.Process(IASTNode tree)
at at NHibernate.Hql.Ast.ANTLR.AstPolymorphicP rocessor.Process()
at at NHibernate.Hql.Ast.ANTLR.AstPolymorphicP rocessor.Process(IASTNode ast, ISessionFactoryImplementor factory)
at at NHibernate.Hql.Ast.ANTLR.ASTQueryTransla torFactory.CreateQueryTranslators(IASTNo de ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at at NHibernate.Hql.Ast.ANTLR.ASTQueryTransla torFactory.CreateQueryTranslators(IQuery Expression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at at NHibernate.Engine.Query.QueryExpressionP lan.CreateTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at at NHibernate.Engine.Query.QueryExpressionP lan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at at NHibernate.Engine.Query.QueryPlanCache.G etHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at at NHibernate.Impl.AbstractSessionImpl.GetH QLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at at NHibernate.Impl.AbstractSessionImpl.Crea teQuery(IQueryExpression queryExpression)
at at NHibernate.Linq.DefaultQueryProvider.Pre pareQuery(Expression expression, IQuery& query)
at at NHibernate.Linq.DefaultQueryProvider.Exe cute(Expression expression)
at at NHibernate.Linq.DefaultQueryProvider.Exe cute[TResult](Expression expression)
at at Remotion.Linq.QueryableBase`1.GetEnumera tor()
at at System.Collections.Generic.List`1.AddEnu merable(IEnumerable`1 enumerable)
at at System.Collections.Generic.List`1..ctor( IEnumerable`1 collection)
at at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at ImageDbLoader.Program.GetImagesInfoFromD b() in D:\development\SkinGuruBack\ImageDbLoade r\Program.cs:52
at ImageDbLoader.Program.Main(String[] args) in D:\development\SkinGuruBack\ImageDbLoade r\Program.cs:18
Помогите решить проблему. Хочется написать красиво этот кусок.

Добавлено через 8 минут
без этой части тоже работает..

C#
1
parentName = models.  >>>>>>>Where(y => y.Id == 2).Select(z=>z.Name)<<<<<<<<  .FirstOrDefault(),
Добавлено через 2 часа 23 минуты
помогите.. цикл в запрос всунуть не получиться..
Как построить лямбда запрос с вложенностью, чтобы работал?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.07.2018, 17:19
Ответы с готовыми решениями:

Лямбда выражение и LINQ. Последовательность без повторений
Как сделать что бы результирующая последовательность имела не повторяющие числа ?

LINQ: Невозможно преобразовать "лямбда-выражение" к типу "string", поскольку он не является делегатом
Здравствуйте. Делаю приложение с использованием Entity Framework. Все было нормально, пока не начал использовать LINQ для выборки...

Linq или не Linq. Linq медленней стандартных методов?
Есть у нас два массива, нужно найти совпадения в первом из второго. Два варианта реализации, первый костылем, второй с linq, но скорость...

4
 Аватар для skilllab
296 / 236 / 58
Регистрация: 03.02.2011
Сообщений: 2,049
Записей в блоге: 1
02.07.2018, 17:56
Лучший ответ Сообщение было отмечено GrafikRem как решение

Решение

Добавлено через 5 минут
Цитата Сообщение от GrafikRem Посмотреть сообщение
Вложенный Linq лямбда не работает
Обычный LINQ работает.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class ModificationsImages
{
    public int ID { get; set; }
    public string Name { get; set; } = string.Empty;
    public int ParentId { get; set; }
 
    public ModificationsImages(int id, string name, int parent)
    {
        ID = id;
        Name = name;
        ParentId = parent;
    }
}
 
public class Models
{
    public int ID { get; set; }
    public string Name { get; set; } = string.Empty;
    public Models(int id, string name)
    {
        ID = id;
        Name = name;
    }
}
 
List<Models> models = new List<Models>() {
    new Models(0, "subOne"), new Models(1, "subTwo")
};
List<ModificationsImages> MainList = new List<ModificationsImages>()
{
    new ModificationsImages(0, "one", 0)
};
 
var search = MainList.Select(
                 x => new
{
    id = x.ID,
    parentID = x.ParentId,
    name = models.Where(y => y.ID == 0).Select(z => z.Name).FirstOrDefault()
}).ToList();
Добавлено через 7 минут
Можно так:
C#
1
2
3
4
5
6
7
8
9
10
string GetName() {
    return models.Where(y => y.ID == 0).Select(z => z.Name).FirstOrDefault();
}
var search2 = MainList.Select(
                  x => new
{
    id = x.ID,
    parentID = x.ParentId,
    name = GetName()
}).ToList();
1
 Аватар для GrafikRem
0 / 0 / 1
Регистрация: 28.11.2015
Сообщений: 53
02.07.2018, 18:45  [ТС]
skilllab, попробовал локальную функцию, но проблема в том что она вне зоны видимости внутри лямбды..
подскажите как передать ее внутрь? спасиб.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
        private static Dictionary<string, Dictionary<string, DateTime>> GetImagesInfoFromDb()
        {
            using (var session = DbImages.OpenSession())
            using (var trans = session.BeginTransaction())
            {
                var models = session.Query<Models>().ToList();
 
                var test = models.Where(y => y.Id == 2).Select(z=>z.Name).FirstOrDefault();
 
 
                 string GetName(int id) //создал локальную функцию
                 {
                     return models.Where(y => y.Id == id).Select(z=>z.Name).FirstOrDefault();
                 }
 
                var modificationsImages = session.QueryOver<ModificationsImages>()
                    .Select(x => new
                    {
                        id = x.Id,
                        name = x.Name,
                        parentId = x.ParentId,
                        parentName = GetName(x.ParentId), //но вызвать не получается..
                        dateWrite = x.DateWrite
                    });
                GetName(1);
 
 
                Console.WriteLine();
            }
}
мне еще из лямбды нужно Id передавать в функцию..

p.s. вроде же лямбда дочерний элемент, и должен иметь видимость на родителя, но..

Добавлено через 20 минут
Program.cs(73, 38): [CS8110] Дерево выражений не может содержать ссылку на локальную функцию
0
CEO
Эксперт С++
 Аватар для Alligieri
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
03.07.2018, 00:03
Лучший ответ Сообщение было отмечено GrafikRem как решение

Решение

GrafikRem, Вы же работаете с провайдером NHibernate а не с LINQ-to-Objects, он не поддерживает такой конструкции при трансляции дерева выражения в SQL, почитайте про Join и используйте его - думаю поможет
1
 Аватар для GrafikRem
0 / 0 / 1
Регистрация: 28.11.2015
Сообщений: 53
03.07.2018, 03:00  [ТС]
Alligieri, спс за совет почитаю..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.07.2018, 03:00
Помогаю со студенческими работами здесь

Переделать SQL запрос на лямбда выражение LINQ
С Новым Годом и доброго всем вечера! есть sql запрос SELECT DISTINCT pblpat.nplpartref , ppartt.npartgenu , ...

Объяснить, как работает код с делегатами и лямбда-выражениями
Есть готовое решение, которое надо доработать под себя. Но не могу разобраться, как работает... Растолкуйте, плиз, начинающему...

Вложенный запрос не работает с IN, работает только с =
SELECT itemid, FROM_UNIXTIME(clock), value FROM zabbix.history_uint WHERE itemid IN ( SELECT itemid FROM zabbix.items WHERE name...

Лямбда-выражения. Как описать лямбда-процедуру и передать в нее файловую переменную?
Погуглив не смогла найти ответов на свои вопросы. Есть следующая процедура, которая находит положительные числа в одном файле и...

Не работает вложенный цикл
Подскажите почему обрабатываются только 200 строк по внутреннему циклу, а по внешнему i не доходит до 2х - должно быть 400 строк declare...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru