2010-11-04 8 views
0

Supposant Je cette requête:Refractoring une requête imbriquée dans LINQ to Entity Framework

var ps = from p in dc.Products 
     let text = 
      (from t in p.Text 
       orderby t.Language == "ja" descending 
       select t).FirstOrDefault() 
     select new { p.Id, text.Name }; 

Est-il possible de REFRACTOR la ​​requête étant attribuée à text? Je pense que je dois en faire un Expression<Func<Product, string, ProductText>>, mais je ne sais pas comment je l'invoquerais. En passant, s'il y a des moyens plus efficaces de le faire, je serais heureux de le savoir.

Merci,

Rei

Edit: Pour clarifier les choses, l'idée est que si japonais n'est pas disponible, je veux qu'il retombe sur toute autre langue est disponible.

Peut-être que c'est plus efficace?

let text = p.Text.FirstOrDefault(t => t.Language == "ja") ?? p.Text.FirstOrDefault() 

De toute façon, ma principale question est de savoir comment je pourrais faire text requête réutilisable - car il est assez peu intuitive, et je peux me représenter ou quelqu'un d'autre faire mal à l'avenir.

Répondre

1

SUR LA BASE D'UN COMMENTAIRE ÉDITÉ

var ps = dc.Products.Select(p => new 
{ 
    Id = p.Id, 
    Text = p.Text.OrderBy(t=> t.Language == "ja").First() 
}) 
.Select (x => new 
{ 
    Id = x.Id, 
    Name = x.Name, 
    ... 
}); 
+0

Pas tout à fait, parce que je veux qu'il retombe sur ce que la langue est disponible. Aussi, il est probable que je vais vouloir plus que juste Name - d'où le 'let'. –

+0

Cela a du sens, bien que je soupçonne que vous voudriez vraiment revenir à une langue spécifique plutôt que d'un aléatoire? Que diriez-vous de la version éditée alors? Bien que maintenant c'est à peu près identique à ce que vous avez commencé. –

+0

Hmm ouais, ça ressemble assez à mon premier. Je suppose que la requête exécutée est à peu près la même chose. Retomber dans une langue particulière serait bien (probablement anglais), mais je m'en soucierai probablement plus tard si jamais je me retrouve avec une troisième langue. Devrait être en mesure d'ajouter juste un 'then by fallbackPriority' ou quelque chose du genre. En ce moment, je suis seulement inquiet pour le japonais et l'anglais. –

Questions connexes