我正在为我的项目制作搜索功能。如何优化我的查询,因为有这么多" if-else"声明?

时间:2016-04-01 11:25:47

标签: c# .net linq

我正在为我的项目制作搜索功能。如何优化具有如此多if else个语句的查询?

我正在使用if else语句来检查是否存在任何空值,但它会增加代码复杂性和内存。我想减少它;如何优化我的查询,以便在查询中包含最少数量的if else语句?

public List<tbltask> gettaskssdata(int c, int userid, string a, string StartDate, string EndDate, string ProjectID, string statusid)
{
    List<tbltask> tbtask = new List<tbltask>();

    var selectproject = entity.tbluserprojects.Where(x => x.user_id == userid).Select(x => x.Projectid);

    if (statusid != "" && ProjectID != "" && a != "" && StartDate != "" && EndDate != "")
    {
        int pid = Convert.ToInt32(ProjectID);
        int sid = Convert.ToInt32(statusid);
        DateTime sdate = Convert.ToDateTime(StartDate).Date;
        DateTime edate = Convert.ToDateTime(EndDate).Date;
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.tblproject.ProjectId == pid) && (x.tblstatu.StatusId == sid) && (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)) && (x.StartDate >= sdate && x.EndDate <= edate)).OrderByDescending(x => x.ProjectId).ToList();
    }
    else if (statusid == "" && ProjectID != "" && a != "" && StartDate != "" && EndDate != "")
    {
        int pid = Convert.ToInt32(ProjectID);
        DateTime sdate = Convert.ToDateTime(StartDate).Date;
        DateTime edate = Convert.ToDateTime(EndDate).Date;
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.tblproject.ProjectId == pid) && (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)) && (x.StartDate >= sdate && x.EndDate <= edate)).OrderByDescending(x => x.ProjectId).ToList();
    }
    else if (ProjectID == "" && statusid != "" && a != "" && StartDate != "" && EndDate != "")
    {
        int sid = Convert.ToInt32(statusid);
        DateTime sdate = Convert.ToDateTime(StartDate).Date;
        DateTime edate = Convert.ToDateTime(EndDate).Date;
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.tblstatu.StatusId == sid) && (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)) && (x.StartDate >= sdate && x.EndDate <= edate)).OrderByDescending(x => x.ProjectId).ToList();
    }
    else if(ProjectID!="" && StartDate == "" && EndDate == "" && statusid == ""  && a == "")
    {
        int pid = Convert.ToInt32(ProjectID);
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.tblproject.ProjectId == pid)).OrderByDescending(x => x.ProjectId).ToList();

    }
    else if(statusid!="" && ProjectID=="" && StartDate == "" && EndDate == ""  && a == "")
    {
        int sid = Convert.ToInt32(statusid);
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.tblstatu.StatusId == sid) ).OrderByDescending(x => x.ProjectId).ToList();
    }
    else if (a == "" && StartDate != "" && EndDate != "" && ProjectID != "")
    {
        int pid = Convert.ToInt32(ProjectID);
        DateTime sdate = Convert.ToDateTime(StartDate).Date;
        DateTime edate = Convert.ToDateTime(EndDate).Date;
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.ProjectId == pid) && (x.StartDate >= sdate && x.EndDate <= edate)).OrderByDescending(x => x.ProjectId).ToList();

    }
    else if (StartDate == "" && EndDate == "" && statusid != "" && ProjectID != "" && a != "")
    {
        int pid = Convert.ToInt32(ProjectID);
        int sid = Convert.ToInt32(statusid);
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.tblproject.ProjectId == pid) && (x.tblstatu.StatusId == sid) && (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a))).OrderByDescending(x => x.ProjectId).ToList();
    }
    else if (a == "" && StartDate == "" && EndDate == "" && ProjectID != "" && statusid != "")
    {
        int pid = Convert.ToInt32(ProjectID);
        int sid = Convert.ToInt32(statusid);
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Include(x => x.tblstatu).Where(x => selectproject.Contains(x.ProjectId) && x.tblproject.company_id == c && x.tblproject.ProjectId == pid && x.tblstatu.StatusId == sid).OrderByDescending(x => x.ProjectId).ToList();
    }
    else if (a != "" && StartDate == "" && EndDate == "" && ProjectID == "" && statusid == "")
    {
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a))).OrderByDescending(x => x.ProjectId).ToList();

    }
    else if (a != "" && ProjectID != "" && StartDate == "" && EndDate == "" && statusid == "")
    {
        int pid = Convert.ToInt32(ProjectID);
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.tblproject.ProjectId == pid) && (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a))).OrderByDescending(x => x.ProjectId).ToList();
    }
    else if (a != "" && StartDate != "" && EndDate != "" && ProjectID == "" && statusid == "")
    {
        DateTime sdate = Convert.ToDateTime(StartDate).Date;
        DateTime edate = Convert.ToDateTime(EndDate).Date;
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && (x.tblproject.company_id == c) && (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)) && (x.StartDate >= sdate && x.EndDate <= edate)).OrderByDescending(x => x.ProjectId).ToList();
    }
    else
    {
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).Where(x => selectproject.Contains(x.ProjectId) && x.tblproject.company_id == c).OrderByDescending(x => x.ProjectId).ToList();
    }
    return tbtask;
}

2 个答案:

答案 0 :(得分:2)

 public List<tbltask> gettaskssdata(int? c, int? userid, string a, string StartDate, string EndDate, int? ProjectID, int? statusid)
    {
        List<tbltask> tbtask = new List<tbltask>();
        DateTime sdate = (StartDate != "") ? Convert.ToDateTime(StartDate).Date : new DateTime();
        DateTime edate = (EndDate != "") ? Convert.ToDateTime(EndDate).Date : new DateTime();
        tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).
            Where(x => x.tblproject.company_id == c
                && (ProjectID == 0 || ProjectID == x.tblproject.ProjectId)
                && (statusid == 0 || statusid == x.tblstatu.StatusId)
                && (a == "" || (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)))
                && ((StartDate == "" && EndDate == "") || ((x.StartDate >= sdate && x.EndDate <= edate)))).ToList();



        return tbtask;


    }

答案 1 :(得分:1)

您可以只有一个LINQ查询,而不是拥有大量if语句。

要做的第一件事是将方法更改为接受可为空的值:

public List<tbltask> gettaskssdata(int? c, int? userid, string a, DateTime? StartDate, DateTime? EndDate, int? ProjectID, int? statusid)
{

然后修改您的LINQ查询。如果用户为过滤器字段提供了空值,我们希望返回该行。此外,如果用户实际提供了值,则进行比较。例如:

tbtask = entity.tbltasks.Where(x => (!c.HasValue || x.tblproject.company_id == c.Value) && ...)
相关问题