2011-08-05 86 views
1

我如何轉換以下SQL從this文章:轉換SQL到LINQ到實體

select type, variety, price 
from fruits 
where price = (select min(price) from fruits as f where f.type = fruits.type) 

我試着這樣說:

ctx.Fruits. 
Where(f => f.Price == ctx.CreateObjectSet<Fruit>(). 
Where(f1 => f1.Type == f.Type).Min(f1 => f1.Price)); 

,但它並沒有因爲ctx.CreateObjectSet工作不能轉換爲SQL。

回答

2

爲什麼不

ctx.Fruits. 
Where(f => f.Price == ctx.Fruits. 
Where(f1 => f1.Type == f.Type).Min(f1 => f1.Price)); 
+0

恥辱我!你是對的。我剛剛使用這個CreateObjectSet 語法的連接,並沒有得到它不會在這裏工作 – SiberianGuy

1

邁克爾Sagalovich的答案是正確的一個給定的SQL,但是要注意的是,如果多個相同類型的水果具有相同的最低價格,您將獲得多次入境那種類型。

這可能是更多的是你要去爲:拼搶只有一個最小价位的水果爲每種類型的:如果你將它表示爲排序依據價格,按水果

ctx.Fruits.GroupBy(f => f.Type) 
    .Select(g => g.OrderBy(f => f.Price).FirstOrDefault()) 
+1

這就是我從...開始......但不幸的是我的EF提供者(MySQL .NET連接器)不支持這種查詢。 – SiberianGuy

1

可能會更清晰,更容易.type,然後在每個組中選擇第一個水果。由於GroupBy保留了訂單,您可以根據哪一個更容易閱讀(或根據性能而定)進行排序(或第二個)。