LinqToSql возвращает IQueryable

#c# #linq-to-sql

#c# #linq-to-sql

Вопрос:

Мой интерфейс возвращает a IQueryable . Модель TemplatesAgent с шаблоном и IEnumerable<Agent> объектом. В моем DataService я собираю все агенты в ListOfAgent . Затем я выбираю агента, который находится в шаблонах, используя AgentVersionKey . Это ошибка, которую я получаю, связана ли она с IQueryable типом?

ExceptionMessage»: «Явное построение типа объекта ‘OrderTemplateTool.Data.Агент’ в запросе не разрешен «.,

Интерфейс

 IQueryable<TemplatesAgent> GetTemplateAgentNameDiseaseName(string agent, string disease);
  

Служба данных

 public IQueryable<TemplatesAgent> GetTemplateAgentNameDiseaseName(string agent, string disease)
{
        //Common 
        var ListOfAgent = (from a in UnitOfWork.GetRepository<Agent>().Get(a => !a.IsDeleted amp;amp; a.IsCurrentVersion)
                           select new Agent
                           {
                               VersionKey = a.VersionKey,
                               Name = a.Name,
                               RxNormId = a.RxNormId,
                               BrandNames = a.BrandNames
                           });


        var TemplatesAgent = (from t in UnitOfWork.GetRepository<Template>().Get()
                                  join r in UnitOfWork.GetRepository<Regimen>().Get() on t.Id equals r.TemplateId
                                  join rp in UnitOfWork.GetRepository<RegimenPart>().Get() on r.Id equals rp.RegimenId
                                  join re in UnitOfWork.GetRepository<RegimenEntry>().Get() on rp.Id equals re.RegimenPartId
                                  where t.IsCurrentVersion 
                                  amp;amp; t.Status == 7 
                                  select new TemplatesAgent
                                  {
                                      Template = t,
                                      Agent = ListOfAgent.Where(x => x.VersionKey == re.AgentVersionKey).ToList()
                                  });
  

Модель

 public class TemplatesAgent
{
    public Template Template { get; set; }
    public IEnumerable<Agent> Agent { get; set; }
}
  

Контроллер

 [HttpGet]
public IHttpActionResult TemplatesList(string key, string disease = null, string agent = null)
{
    var result = TemplatesDataService.GetTemplateAgentNameDiseaseName(agent, disease)
        .Where(
            t =>
                t.Template.IsCurrentVersion amp;amp; t.Template.Status == (short)TemplateMode.Published)
        .OrderBy(t => t.Template.TemplateIdMain)
        .ThenBy(t => t.Template.TemplateIdNumeric)
        .ThenBy(t => t.Template.TemplateIdAlt)
        .ToList()
        .Select(t => new
        {
            TemplateId = t.Template.TemplateId,
            RegimenTitle = t.Template.Title,
            CourseTitle = t.Template.GroupTitle,
            GuidelineTitle = t.Template.GuideLineTitle,
            DiseaseId = t.Template.ExternalDiseaseId,
            DiseaseName = t.Template.DiseaseName
            Agent = t.Agent(a => new
            {
                VersionKey = a.VersionKey,
                Name = a.Name,
                BrandNames = a.BrandNames,
                RxNormId = a.RxNormId
            }).ToList(),
        })
            .Distinct().ToList();

    return Json(result);
}
  

Ответ №1:

Это говорит вам, что вы не можете создать new Agent запрос внутри. Попробуйте это.

     var agentRepo = UnitOfWork.GetRepository<Agent>().Get();
    var ListOfAgent = (from a in agentRepo
                       where !a.IsDeleted amp;amp; a.IsCurrentVersion
                       select a);


    var TemplatesAgent = (from t in UnitOfWork.GetRepository<Template>().Get()
                              join r in UnitOfWork.GetRepository<Regimen>().Get() on t.Id equals r.TemplateId
                              join rp in UnitOfWork.GetRepository<RegimenPart>().Get() on r.Id equals rp.RegimenId
                              join re in UnitOfWork.GetRepository<RegimenEntry>().Get() on rp.Id equals re.RegimenPartId
                              where t.IsCurrentVersion 
                              amp;amp; t.Status == 7 
                              select new TemplatesAgent
                              {
                                  Template = t,
                                  Agent = ListOfAgent.Where(x => x.VersionKey == re.AgentVersionKey).ToList()
                              });
  

Контроллер

 [HttpGet]
public IHttpActionResult TemplatesList(string key, string disease = null, string agent = null)
{
    var result = TemplatesDataService.GetTemplateAgentNameDiseaseName(agent, disease)
        .Where(
            t =>
                t.Template.IsCurrentVersion amp;amp; t.Template.Status == (short)TemplateMode.Published)
        .OrderBy(t => t.Template.TemplateIdMain)
        .ThenBy(t => t.Template.TemplateIdNumeric)
        .ThenBy(t => t.Template.TemplateIdAlt)
        .Distinct().ToList();

    return Json(result);
}
  

Комментарии:

1. Если я делаю select a , то контроллер получает сообщение об ошибке, которое нельзя использовать как метод?

2. Я обновил свой ответ. Попробуйте это. Я думаю, что проблема связана с ListOfAgent тем, что не выполняется, прежде чем вы попытаетесь использовать его в другом Lambda в TemplatesAgent

3. Получаем ту же ошибку Explicit construction of entity type , и это происходит в строке ListOfAgent.

4. Используете ли вы EF Core?

5. использование MSLinqToSQL