этот метод не может быть преобразован в выражение магазина, когда я вызываю другой репозиторий в моем запросе

1

Я пытаюсь выполнить такой запрос:

  List<UserAssitanceView> AllAssitance = objFirstIdeaAssistanceRepository.GetAll().Select(i => new UserAssitanceView()
    {
        assitanceId = i.Assistance.Id.ToString(),
        assitanceInternalTell = i.Assistance.AssistanceTell,
        assitanceName = i.Assistance.AssistanceName,
        experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name,
        expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family,
        ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile
    }).ToList();

public class UserAssitanceView
    {
        public string assitanceId { set; get; }
        public string assitanceName { set; get; }
        public string experteName { set; get; }
        public string expertFamily { set; get; }
        public string assitanceInternalTell { set; get; }
        public string ExperteMobile { set; get; }


    }

Класс FirstIdeaAssistance:

namespace DomainClass
{
    using System;
    using System.Collections.Generic;

    public partial class FirstIdeaAssistance
    {
        public int Id { get; set; }
        public string Date { get; set; }
        public long FirstIdeaId { get; set; }
        public int AssistanceId { get; set; }

        public virtual FirstIdea FirstIdea { get; set; }
        public virtual Assistance Assistance { get; set; }
    }
}

В моем запросе я вызываю другой метод репозитория, называемый objAssistanceRepository.ReturnExpertOfAssitance и функция такова:

public class AssistanceRepository : GenericRepository<InModelContainer, Assistance>
{
    public User ReturnExpertOfAssitance(int assitanceId)
    {
        return
            FindBy(i => i.Id == assitanceId && i.AssistanceJurors.Any(j => j.User.Permission == "Assistance"))
                .First().AssistanceJurors.Select(i => i.User).First();
    }
}

После выполнения этой ошибки я получил следующую ошибку:

LINQ to Entities does not recognize the method 'DomainClass.User ReturnExpertOfAssitance(Int32)' method, and this method cannot be translated into a store expression.

Когда я удаляю эти 3 строки из своего кода, он отлично работает:

experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name,
            expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family,
            ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile

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

Все идеи будут рассмотрены

с наилучшими пожеланиями

  • 0
    Покажите свой класс FirstIdeaAssistance .
  • 0
    @haim770 haim770 я обновил свой вопрос
Показать ещё 1 комментарий
Теги:
entity-framework
lambda
query-expressions

1 ответ

1
Лучший ответ

Linq не распознает этот метод. Его можно перевести только из дерева выражений и некоторых расширений функций SQL.

Сначала нужно выполнить запрос.

List<UserAssitanceView> AllAssitance = objFirstIdeaAssistanceRepository.GetAll().Select(i => new UserAssitanceView()
    {
        assitanceId = i.Assistance.Id.ToString(),
        assitanceInternalTell = i.Assistance.AssistanceTell,
        assitanceName = i.Assistance.AssistanceName,
    })
   .ToList();

А потом установите некоторые свойства позже.

foreach (var item in AllAssitance)
{
    item.experteName = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Name;
    item.expertFamily = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Family;
    item.ExperteMobile = objAssistanceRepository.ReturnExpertOfAssitance(i.AssistanceId).Mobile;
}

Или вы можете просто выполнить его сначала для всего запроса.

List<UserAssitanceView> AllAssitance = 
     objFirstIdeaAssistanceRepository.GetAll().AsEnumerable().Select
                                                  ^^^^
                                                add this

PS

AsEnumerable изменит тип с IQueryable<T> на IEnumerable<T> и вызовет IQueryable<T> выполнение только при его повторении. Это гарантирует, что любое выполнение после этого вызова не будет выполнять базу данных, а просто перечислит из перечислимого. Поэтому теперь безопасно использовать выражение non linq, например, метод CLR.

Этот код не выполнит запрос.

var result = objFirstIdeaAssistanceRepository.GetAll().AsEnumerable();

Но добавив после этого метод Select он выполнит запрос.

var result = objFirstIdeaAssistanceRepository.GetAll().AsEnumerable().Select(/* */);
  • 0
    Я постараюсь, просто не могли бы вы дать более подробную информацию о AsEnumerable

Ещё вопросы

Сообщество Overcoder
Наверх
Меню