2010-02-03 91 views
1

以下爲AdventureWorks數據庫一個T_SQL查詢:需要幫助一個更漂亮的LINQ to SQL查詢

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

我嘗試寫這個LINQ查詢:

 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; 

我怎麼能使它更美麗(即將這些查詢結合在一起,還是更有效的方法)?

非常感謝您

回答

1

給這兩種一試:

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

謝謝艾哈邁德。我從你的答案中學到了很多東西。在第一個查詢中,它是我需要的'let'子句。第二個查詢,您使用標準點符號語法。在這種情況下,我發現第一個查詢更具可讀性。 – user264967 2010-02-03 07:28:48

+0

@匿名downvoter?感謝無端的downvote ... – 2010-02-03 14:55:24

0

也許我失去了與分組的東西,但我不明白爲什麼它是必要的。

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

是的,我很理解你的意思。這裏不需要分組。我只是用它,因爲我想讓我的LINQ查詢看起來像T_SQL查詢。 – user264967 2010-02-03 07:07:36

+0

在T-SQL查詢中也沒有必要 - 這只是浪費。你要求一個更美麗和有效的方法;我想我提供了兩個。 – Jay 2010-02-03 14:44:11

+0

是的,你是對的。你的回答超出了我的期望。我的問題是我只關注查詢語法,而不是它的意思。非常感謝您的幫助。 – user264967 2010-02-04 01:10:26