#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