2010-02-03 6 views
1

Voici une requête T_SQL pour la base de données AdventureWorks:Besoin d'aide pour une plus belle requête LINQ to SQL

SELECT Name
FROM Production.Product
WHERE ListPrice >= ANY
(SELECT MAX (ListPrice)
FROM Production.Product
GROUP BY ProductSubcategoryID)

je tente d'écrire une requête LINQ pour cela:

 var groupMaxPricesquery2 = from product in dc.Products 
            group product by product.ProductSubcategoryID into productGroup 
            select productGroup.Max(eachProductInGroup => eachProductInGroup.ListPrice); 

     var query = from product in dc.Products 
        where groupMaxPricesquery2.Any(listPrice => listPrice <= product.ListPrice) 
        select product.Name; 

Comment puis-je le rendre plus beau (c'est-à-dire combiner ces requêtes ensemble, ou une approche plus efficace)?

Merci beaucoup

Répondre

1

Donnez l'une de ces essayer:

var query = from product in dc.Products 
      let groupMaxPricesQuery = dc.Products.GroupBy(p => p.ProductSubcategoryID) 
               .Select(g => g.Max(item => item.ListPrice)) 
      where groupMaxPricesQuery.Any(listPrice => listPrice <= product.ListPrice) 
      select product.Name; 

// or 
var query = dc.Products 
       .Select(product => new { 
        Product = product, 
        GroupedMaxPrices = dc.Products.GroupBy(p => p.ProductSubcategoryID) 
               .Select(g => g.Max(item => item.ListPrice)) 
      }) 
      .Where(item => item.GroupedMaxPrices.Any(listPrice => listPrice <= item.Product.ListPrice)) 
      .Select(item => item.Product.Name); 
+0

Merci Ahmad. J'ai beaucoup appris de vos réponses. Dans la première requête, c'est la clause 'let' dont j'ai besoin. La deuxième requête, vous utilisez la syntaxe de notation par points standard. Dans ce cas, je trouve la première requête plus lisible. – user264967

+0

@ DownvoterAnonyme? Merci pour la downvote injustifiée ... –

0

Peut-être que je manque quelque chose avec le groupe, mais je ne vois pas pourquoi il est nécessaire.

var maxListPrice = dc.Products.Max(p => p.ListPrice); 
var query = dc.Products.Where(p => p.ListPrice >= maxListPrice).Select(n => n.Name); 
+0

Oui, je comprends tout à fait ce que vous voulez dire. Le regroupement n'est pas nécessaire ici. Je l'utilise simplement parce que je veux que ma requête LINQ ressemble à la requête T_SQL. – user264967

+0

Ce n'est pas non plus nécessaire dans la requête T-SQL - c'est juste du gaspillage. Vous avez demandé une approche plus belle et efficace; Je pense que j'ai fourni les deux. – Jay

+0

Oui, vous avez raison. Votre réponse est au-delà de mes attentes. Mon problème était que je me concentrais sur la syntaxe de la requête, pas sur sa signification. Merci beaucoup pour votre aide. – user264967