Платформа ABP LINQ to Entities для подзапроса 'count'

Запрос для GetAllForumMember, какой-нибудь совет?

Снимок экрана

System.NotSupportedException: «LINQ to Entities не распознает метод System.Linq.IQueryable`1[Weixin.Kia.Community.ThreadComment] GetAll()», и этот метод не может быть преобразован в выражение хранилища».


person Mc xie    schedule 04.09.2017    source источник
comment
Пожалуйста, добавьте код, а не снимок экрана. Там сообщение об ошибке говорит вам, в чем проблема. LINQ to Entities не может преобразовать метод GetAll в SQL. Попробуйте реструктурировать код, чтобы использовать таблицы в базе данных, а не в репозиториях.   -  person Scrobi    schedule 04.09.2017
comment
спасибо за совет по замене кода, а не скриншота. На самом деле я не знаю, как построить подзапросы для count() в EF. и сообщение об ошибке - это сообщение, которое не может сказать мне, как это сделать. как. select threadCount = (select (1) from dbo.Thread t WHERE t.userId = @tm.userId) from dbo.ThreadMember tm Исходный SQL на самом деле намного проще, чем EF.   -  person Mc xie    schedule 04.09.2017
comment
@Mcxie Почему вы используете метод/расширение GetAll() и из какого пространства имен вы получаете этот метод/расширение/сборку?   -  person Progman    schedule 04.09.2017


Ответы (1)


На данный момент ваш код вызывает ваш класс репозитория, и структура Entity не может преобразовать это в SQL.

Я предположил, как устроены ваши модели, но вы можете решить свою проблему, используя таблицы в базе данных, а не в своем репозитории.

public class ForumMember
{
    public int Id { get; set; }
}

public class Member
{
    public int MemberId { get; set; }
}

public class ThreadComment
{
    public int CreatorUserId { get; set; }
}


public class ForumContext : DbContext
{
    public DbSet<ForumMember> ForumMembers { get; set; }
    public DbSet<Member> Members { get; set; }
    public DbSet<ThreadComment> ThreadComments { get; set; }
}

public class Repository
{
    public IEnumerable<Something> GetAllForumMember()
    {
        using (var context = new ForumContext())
        {
            var query = from fm in context.ForumMembers
                        join m in context.Members on fm.Id equals m.MemberId
                        //where add where clause
                        select new Something
                        {
                            memberId = m.MemberId,
                            commentCount = context.ThreadComments.Count(x => x.CreatorUserId == m.MemberId)
                            //... add other properties that you want to get.
                        };

             return query.ToList();

        }
    }
}

Обратите внимание, что это непроверенный код. Существует кривая обучения использованию Entity Framework и Linq-to-SQL, поэтому я бы посоветовал вам пройти учебные пособия. Вы также можете получить такие инструменты, как LinqPad, которые могут помочь вам привыкнуть к написанию запросов Linq в вашей базе данных.

Я надеюсь, что это несколько полезно. Если вы не можете обновить свой вопрос, добавив дополнительную информацию, например. включая код для ваших моделей или контекст базы данных.

person Scrobi    schedule 04.09.2017
comment
спасибо, я обнаружил, что мы также можем использовать свойство навигации. - person Mc xie; 05.09.2017