【问题标题】:LinqToSQL returning IQueryableLinqToSQL 返回 IQueryable
【发布时间】:2020-11-02 16:35:09
【问题描述】:

我的界面返回一个IQueryable。带有模板和IEnumerable<Agent> 对象的模型TemplatesAgent。在我的DataService 中,我正在收集ListOfAgent 中的所有代理。然后我使用AgentVersionKey 选择模板中的代理。这是我得到的错误,它与IQueryable 类型有关吗?

ExceptionMessage": "不允许在查询中显式构造实体类型 'OrderTemplateTool.Data.Agent'。",

界面

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 && 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 
                                  && 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 && 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);
}

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

    它告诉您不能在查询中创建new Agent。试试这个。

        var agentRepo = UnitOfWork.GetRepository<Agent>().Get();
        var ListOfAgent = (from a in agentRepo
                           where !a.IsDeleted && 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 
                                  && 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 && 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);
    }
    

    【讨论】:

    • 如果我执行select a 那么控制器出现错误不能像方法一样使用?
    • 我已经更新了我的答案。尝试这个。我认为这个问题与ListOfAgent 在您尝试在TemplatesAgent 中的另一个Lambda 中使用它之前未执行有关
    • 得到同样的错误Explicit construction of entity type,它发生在 ListOfAgent 行。
    • 你在使用 EF Core 吗?
    • 使用 MSLinqToSQL
    猜你喜欢
    • 2010-10-17
    • 2017-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多