2017-03-06 112 views
1

我有两个方法,一类很相似:删除代码重复

public class MyClass 
{ 
    public MyClass() 
    { 

    } 

    public IQueryable<tbl_Person> PersonSelect1() 
    { 
     var ctx = new MyContextSQL(); 
     var temp = ctx.tbl_Person.Include("tbl_Student").Include("Department").Where(x => 
      (x.int_statID == 2 || x.int_statID == 1 || x.int_statID == 9) 
      && (x.department != 90 && x.department != 94) // only difference 
      && (x.workID == 789 || x.workID == 567) 
      && (x.clientID != 789247) 
      && (x.auditID != 9) 
      && (x.expDate >= new DateTime(2017, 1, 1)) 
      && (x.expDate <= DateTime.Today)); 
     var result = temp.OrderByDescending(x => x.expDate); 
     return result; 
    } 

    public IQueryable<tbl_Person> PersonSelect2() 
    { 
     var ctx = new MyContextSQL(); 
     var temp = ctx.tbl_Person.Include("tbl_Student").Include("Department").Where(x => 
      (x.int_statID == 2 || x.int_statID == 1 || x.int_statID == 9) 
      && (x.department == 90 || x.department == 94) //only difference 
      && (x.workID == 789) 
      && (x.clientID != 789247) 
      && (x.auditID != 9) 
      && (x.expDate >= new DateTime(2017, 1, 1)) 
      && (x.expDate <= DateTime.Today)); 
     var result = temp.OrderByDescending(x => x.expDate); 
     return result; 
    } 
} 

只有PersonSelect1()PersonSelect2()之间不同的一条线,我不喜欢它的样子,因为有很多的代码重复。 我一直在思考在解决这样的:

public IQueryable<tbl_Person> ThirdMethod() 
    { 
     var ctx = new MyContextSQL(); 
     var temp = ctx.tbl_Person.Include("tbl_Student").Include("Department").Where(x => 
      (x.int_statID == 2 || x.int_statID == 1 || x.int_statID == 9)   
      && (x.workID == 789) 
      && (x.clientID != 789247) 
      && (x.auditID != 9) 
      && (x.expDate >= new DateTime(2017, 1, 1)) 
      && (x.expDate <= DateTime.Today)); 
     var result = temp.OrderByDescending(x => x.expDate); 
     return result; 
    } 

    public IQueryable<tbl_Person> PersonSelect1() 
    { 
     var result = this.ThirdMethod().Where(x => (x.department != 90 || x.department != 94));  
     return result; 
    } 

    public IQueryable<tbl_Person> PersonSelect2() 
    { 
     var result = this.ThirdMethod().Where(x => (x.department == 90 || x.department == 94)); 
     return result; 
    } 

那是考虑到ThirdMethod()将连接到数据库,然后从PersonSelect1()PersonSelect2()我会再次循环针对收集源于ThirdMethod()呼叫的最佳方法呢?我正在考虑性能,并试图在同一时间避免重复的代码。

+3

&&(x.department!= 90 || x.department!= 94)//唯一的区别这会八方通是真的 –

+0

我粘贴一个老版本的代码并没有意识到这件事,这是现在在这里更新反正,谢谢 – AlexGH

+1

为什么你不用共享参数创建一个SQL视图,这样你的c#代码只会调用视图和过滤器,使用'x.department!= 90 || x.department!= 94' /'x.department!= 90 || x.department == 94' – maccettura

回答

1

下面的变量名是可怕的,语法可能是关闭的(我已经远离.net几年),但最简单的事情是有ThirdMethod除了一些参数,并相应地构建查询:

public IQueryable<tbl_Person> ThirdMethod(bool isFirstPerson) 
{ 
    var ctx = new MyContextSQL(); 
    var temp = ctx.tbl_Person.Include("tbl_Student").Include("Department").Where(x => 
     (x.int_statID == 2 || x.int_statID == 1 || x.int_statID == 9) 
     && isfirstPerson ? 
      (x.department != 90 && x.department != 94) : (x.department == 90 || x.department == 94)  
     && (x.workID == 789) 
     && (x.clientID != 789247) 
     && (x.auditID != 9) 
     && (x.expDate >= new DateTime(2017, 1, 1)) 
     && (x.expDate <= DateTime.Today)); 
    var result = temp.OrderByDescending(x => x.expDate); 
    return result; 
} 

public IQueryable<tbl_Person> PersonSelect1() 
{ 
    return this.ThirdMethod(true); 
} 

public IQueryable<tbl_Person> PersonSelect2() 
{ 
    return this.ThirdMethod(false); 
} 
0

不确定,但你能做这样的事吗?

public IQueryable<tbl_Person> PersonSelect() 
{ 
    var ctx = new MyContextSQL(); 
    var temp = ctx.tbl_Person.Include("tbl_Student").Include("Department").Where(x => 
     (x.int_statID == 2 || x.int_statID == 1 || x.int_statID == 9) 
     && (x.workID == 789 || x.workID == 567) 
     && (x.clientID != 789247) 
     && (x.auditID != 9) 
     && (x.expDate >= new DateTime(2017, 1, 1)) 
     && (x.expDate <= DateTime.Today)); 
    var result = temp.OrderByDescending(x => x.expDate); 
    return result; 
} 

public IQueryable<tbl_Person> PersonSelect1() 
{ 
    var ctx = PersonSelect(); 
    ctx.tbl_Person.Include("tbl_Student").Include("Department").Where(x => (
     (x.department != 90 && x.department != 94); 
    return result; 
} 

public IQueryable<tbl_Person> PersonSelect2() 
{ 
    var ctx = PersonSelect(); 
    ctx.tbl_Person.Include("tbl_Student").Include("Department").Where(x => (
     (x.department == 90 && x.department == 94); 
    return result; 
} 
1

而不是试图让应用程序共享逻辑,你可以创建一个共享逻辑的SQL视图,让你的C#只做不同的过滤器。

这也会提高性能,因为视图执行速度比LINQ2SQL快。