【问题标题】:.Net Entity two optional parameters.Net Entity 两个可选参数
【发布时间】:2019-01-28 17:22:34
【问题描述】:

我是 .Net Entity 框架的新手,正在寻找一种方法来编写一个可以接受两个可选参数的函数。有没有更好的方法来做到这一点?

public IQueryable<Template> GetTemplateAgentKeyDiseaseId(Guid agentKey, Guid diseaseId)
    {
        if (diseaseId != null)
        {
            return 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
                   join a in UnitOfWork.GetRepository<Agent>().Get() on re.AgentVersionKey equals a.VersionKey
                   where a.VersionKey == agentKey && t.IsCurrentVersion
                   select t;
        }
        else if (agentKey != null) 
        {

            return 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
                   join a in UnitOfWork.GetRepository<Agent>().Get() on re.AgentVersionKey equals a.VersionKey
                   where t.IsCurrentVersion && t.ExternalDiseaseId == diseaseId
                   select t;
        }else
        {
            return 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
                   join a in UnitOfWork.GetRepository<Agent>().Get() on re.AgentVersionKey equals a.VersionKey
                   where a.VersionKey == agentKey && t.IsCurrentVersion && t.ExternalDiseaseId == diseaseId
                   select t;
        }

【问题讨论】:

  • 这似乎更像是一个 LINQ 问题而不是实体框架。
  • 另外,如果你不改变代码的工作方式,你可以将公共部分抽象成一个私有方法,以清理代码。
  • 如果我错了,请纠正我,但 Guid 永远不会为空。您可能应该使用 Guid?否则你的最后一条语句将是唯一执行的语句。
  • @ryanwebjackson 任何例子都会有所帮助

标签: .net entity-framework-4


【解决方案1】:
  1. 你的 ifs if (diseaseId != null) 颠倒了
  2. Guid 是结构,所以它永远不会为空,请使用 Guid?

你可以提取公共部分:

        public IQueryable<Template> GetTemplateAgentKeyDiseaseId(Guid? agentKey, Guid? diseaseId)
        {
            //Common part
            var query = 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
                        join a in UnitOfWork.GetRepository<Agent>().Get() on re.AgentVersionKey equals a.VersionKey
                        where t.IsCurrentVersion
                        select new
                        {
                            T = t,
                            VersionKey = a.VersionKey,
                        };

            //Extra filters
            if (agentKey != null)
            {
                query = query.Where(o => o.VersionKey == agentKey);
            }
            if (diseaseId!= null)
            {
                query = query.Where(o => o.T.ExternalDiseaseId == diseaseId);
            }

            return query.Select(o => o.T);
        }

(由于我没有无法编译的类,您可能需要调整此代码)

【讨论】:

    猜你喜欢
    • 2018-12-10
    • 2019-01-28
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 1970-01-01
    • 2016-01-20
    • 1970-01-01
    相关资源
    最近更新 更多