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

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

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

Author24 — интернет-сервис помощи студентам
Вложенный 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.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
at at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree)
at at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process()
at at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process(IASTNode ast, ISessionFactoryImplementor factory)
at at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNo de ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IQuery Expression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
at at NHibernate.Engine.Query.QueryExpressionPlan.CreateTranslators(IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at at NHibernate.Engine.Query.QueryExpressionPlan..ctor(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
at at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
at at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
at at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
at at NHibernate.Linq.DefaultQueryProvider.PrepareQuery(Expression expression, IQuery& query)
at at NHibernate.Linq.DefaultQueryProvider.Execute(Expression expression)
at at NHibernate.Linq.DefaultQueryProvider.Execute[TResult](Expression expression)
at at Remotion.Linq.QueryableBase`1.GetEnumerator()
at at System.Collections.Generic.List`1.AddEnumerable(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.GetImagesInfoFromDb() in D:\development\SkinGuruBack\ImageDbLoader\Program.cs:52
at ImageDbLoader.Program.Main(String[] args) in D:\development\SkinGuruBack\ImageDbLoader\Program.cs:18
Помогите решить проблему. Хочется написать красиво этот кусок.

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

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

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

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

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

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

4
294 / 234 / 58
Регистрация: 03.02.2011
Сообщений: 1,993
Записей в блоге: 1
02.07.2018, 17:56 2
Лучший ответ Сообщение было отмечено 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
0 / 0 / 1
Регистрация: 28.11.2015
Сообщений: 53
02.07.2018, 18:45  [ТС] 3
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
Эксперт С++
2258 / 1248 / 57
Регистрация: 16.03.2009
Сообщений: 3,588
03.07.2018, 00:03 4
Лучший ответ Сообщение было отмечено GrafikRem как решение

Решение

GrafikRem, Вы же работаете с провайдером NHibernate а не с LINQ-to-Objects, он не поддерживает такой конструкции при трансляции дерева выражения в SQL, почитайте про Join и используйте его - думаю поможет
1
0 / 0 / 1
Регистрация: 28.11.2015
Сообщений: 53
03.07.2018, 03:00  [ТС] 5
Alligieri, спс за совет почитаю..
0
03.07.2018, 03:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2018, 03:00
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru