2011-11-19 48 views
3
private static Game[] getMostPlayedGamesDo(int Fetch, int CategoryID) 
{ 
    Game[] r; 
    using (MainContext db = new MainContext()) 
    { 
     if (CategoryID == 0) 
     { 
      var q = db.tblArcadeGames.OrderByDescending(c => c.Plays).Take(Fetch); 
      r = new Game[q.Count()]; 
      int i = 0; 
      foreach (var g in q) 
      { 
       r[i] = new Game(g); 
       i++; 
      } 
     } 
     else 
     { 
      var q = db.tblArcadeGames.Where(c=>c.CategoryID == CategoryID).OrderByDescending(c => c.Plays).Take(Fetch); 
      r = new Game[q.Count()]; 
      int i = 0; 
      foreach (var g in q) 
      { 
       r[i] = new Game(g); 
       i++; 
      } 
     } 
    } 
    return r; 
} 

我似乎无法定义q范围以外的if,我不能将返回的值插入到if的范围之外的数组!不确定如何删除这个简单实例中的重复代码?如何删除此方法中的重复代码?

+1

你不能让q为具体类型吗?在这两种情况下q是什么?必须有一个共同的基础? – JamesSugrue

+0

@Kiwi抱歉,我不太了解它,我一直将我的LINQ定义为var类型 –

+1

@Tom,在您的dbml中生成的tblArcadeGames类是什么?如果是tblArcadeGame,那么q的类型可以是List 或IQueryable 。看看柯克斯沃尔的答案和我的。 – dpp

回答

4

目前尚不清楚的q的类型是什么 - 但是从您的使用情况推断:

db.tblArcadeGames.OrderByDescending(...) 

大概是从Linq-实体类To-Sql或实体框架。在这种情况下,你有一个具体的实体定义,大概名为tblArcadeGame。因此,移动q出范围的通过不使用var

IQueryable<tblArcadeGame> q; 
if (CategoryID == 0) 
{ 
    q = db.tblArcadeGames.OrderByDescending(c => c.Plays).Take(Fetch); 
} 
else 
{ 
    q = db.tblArcadeGames.Where(c=>c.CategoryID == CategoryID).OrderByDescending(c => c.Plays).Take(Fetch); 
} 
r = new Game[q.Count()]; 
int i = 0; 
foreach (var g in q) 
{ 
    r[i] = new Game(g); 
    i++; 
} 

正如你所看到的,重复的代码,现在只看到一次。

P.S.像ReSharper这样的工具对于这类事情来说非常棒。使用它,只需一次按键,您就可以在var版本和使用明确命名类型的版本之间切换。

+0

非常感谢你这么多! –

0
List<tblArcadeGame> q; 
    /* object q; */ 


    if (CategoryID == 0) 
    { 
     q = db.tblArcadeGames.OrderByDescending(c => c.Plays).Take(Fetch).ToList(); 
    } 
    else 
    { 
     q = db.tblArcadeGames.Where(c=>c.CategoryID == CategoryID).OrderByDescending(c => c.Plays).Take(Fetch).ToList(); 
    } 

     r = new Game[q.Count()]; 
     int i = 0; 
     foreach (var g in q) 
     { 
      r[i] = new Game(g); 
      i++; 
     } 

我假设qList<tblArcadeGame>

+0

两件事。在没有rhs的情况下,不能有var,即使在这个例子中q可能是三个不同的变量 – JamesSugrue

+0

不起作用,在第一个'var q;'上必须初始化'隐式类型局部变量'。这是什么导致我的困难,因为它很容易删除重复的代码,但是当涉及到linq时并不那么容易。 –

+0

我不知道...我假设他提供的所有代码都是正确的。我刚刚重建了它。 – dpp

1

你应该真的明确键入q。但是这可能会让你没有它(三元操作符会为你执行)。

var q = CategoryID == 0 ? db.tblArcadeGames.OrderByDescending(c => c.Plays).Take(Fetch) 
         : db.tblArcadeGames.Where(c=>c.CategoryID == CategoryID).OrderByDescending(c => c.Plays).Take(Fetch); 

r = new Game[q.Count()]; 
int i = 0; 
foreach (var g in q) 
{ 
    r[i] = new Game(g); 
    i++; 
} 
1

我假设q是IQueryable类型。

private static Game[] getMostPlayedGamesDo(int Fetch, int CategoryID) 
{ 
    var q = db.tblArcadeGames; 
    if (CategoryID != 0) 
    { 
     q = q.Where(c => c.CategoryID == CategoryID); 
    } 
    q = q.OrderByDescending(c => c.Plays).Take(Fetch); 
    return q.Select(g => new Game(g)).ToArray(); 
}