Search code examples
.netentity-framework-4

.Net Entity two optional parameters


I am new to .Net Entity framework and was looking for a way to write an function that can take in two optional parameters. Is there a better way to do this ?

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

Solution

    1. You have the ifs if (diseaseId != null) reversed
    2. Guid is struct so it will never be null, use Guid?

    You can extract the common part:

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

    (Since I don't have the classes I wasn't able to compile this, you may need to adjust this code)