2011-09-29 2 views
1

Salut J'ai une méthode comme:instruction Select prend beaucoup de temps

public JsonResult GetActivities(int id) 
{ 
    var activities = ActivityRepository.GetAll().Where(x => x.AreaId == id); 

    var jsonData = new { 
     rows = activities.Select(q => new { 
      Id = q.Id.ToString(), 
      q.Descriptor 
     }).ToList() 
    }; 

    return Json(jsonData, JsonRequestBehavior.AllowGet); 
} 

Il fonctionne très bien, mais je trouve la ligne:

var jsonData = new 
{ 
    rows = activities.Select(q => new { Id = q.Id.ToString(), q.Descriptor }).ToList() 
}; 

prend un temps très long à exécuter.

Quelqu'un pourrait-il m'expliquer pourquoi cela est et est-il un moyen plus efficace?

+2

Cela semble correct, mais nous avons besoin de plus d'informations ... Si vous avez un profileur SQL, exécutez-le et voyez quelle requête frappe la base de données. – geofftnz

+0

Comment avez-vous déterminé que la ligne prend beaucoup de temps? –

+0

Combien de lignes sont renvoyées par votre requête? Quel est le type de données de l'Id? Je demande parce que les entiers sont plus rapides que les GUID. –

Répondre

1

Le problème est très probablement lié à votre base de données en quelque sorte ...

Comme @geofftnz ont déjà mentionné, vous devez utiliser un profileur SQL (ex. AnjLab Sql Profiler), et comprendre ce qui se passe dans les coulisses .

La raison pour qu'il ne prend pas beaucoup de temps pour:

var activities = ActivityRepository.GetAll().Where(x => x.AreaId == id); 

est qu'il est de ne pas envoyer des requêtes à la base de données encore, en raison du type de retour IEnumerable<Activity> (paresseux).

Cependant quand vous faites:

var jsonData = new 
{ 
    rows = activities.Select(q => new 
    { 
     Id = q.Id.ToString(), 
     q.Descriptor 
    }).ToList() 
}; 

il fera une requête, et appuyez sur la base de données à .ToList() (impatient).

+0

n'est pas 'activités' une mémoire' IEnumerable 'à ce stade? Comment la deuxième requête a-t-elle atteint la base de données? – Bastardo

+0

@JohnnyCageWins: Basé sur le comportement décrit par l'OP, 'activities' est presque certainement une requête soutenue par un fournisseur LINQ (très probablement lié à une base de données). L'appel à '.ToList' force l'évaluation de la requête, c'est-à-dire quand elle frappe la base de données. – StriplingWarrior

+0

@Str merci. – Bastardo

Questions connexes