Я пытаюсь выполнить такой запрос:
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
Я сделал это раньше, и это сработало хорошо, но теперь я не знаю, почему я получаю эту ошибку.
Все идеи будут рассмотрены
с наилучшими пожеланиями
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(/* */);
FirstIdeaAssistance
.