2013-04-22 147 views
-1

我想使用linq to Entities将top记录按降序列Value1排序。linq to EF,如何使用'top`方法

我知道我CA写像:

MyCollection.OrderByDescending(项目=> item.Value1).FirstOrDefault();

但是,如何使用以下方法Top

System.Data.Objects.ObjectQuery.Top(字符串,则params System.Data.Objects.ObjectParameter [])

+0

http://msdn.microsoft.com/ru-ru/library/bb300906.aspx – 2kay 2013-04-22 08:14:49

回答

5

编辑:当问题是特别有关的LINQ to SQL这个答案写。

System.Data.Objects用于实体框架,而不是LINQ到远SQL我可以告诉 - 而是要找到SQL甚至LINQ的前N值或者LINQ到对象,你通常只使用Take

var query = db.Customers 
       .OrderByDescending(c => c.Value1) 
       .Take(10); 

(我真的鼓励你尝试虽然比Value1使用更有意义的名称......)

编辑:即使是在实体框架,我通常是在LINQ查询中使用Take - 这是代表性的“LINQ方式”前N个结果。如果您确实想要使用Top,则documentation会提供示例 - 但您应该考虑为什么要使用Top而不是Take。 (你给我们没有上下文来处理。)

+0

我的不好,我的意思是实体。我知道这个语法。我特别询问了“top”语法。我找到了答案:'Top(1,new ObjectParameter(“@ CtidProdId”))。Select(item => item.CtidProdId).SingleOrDefault()' – 2013-04-22 08:18:16

+2

@EladBenda:Jon向你展示的是LINQ等价的SQL' top'。 – 2013-04-22 08:20:33

+1

@EladBenda:您特意询问了有关LINQ to SQL的问题,然后您改变了您的问题。你还说你知道'FirstOrDefault',这与知道'Take'不一样。如果你打算提出错误的问题,你应该期望得到不包括你想要的答案。说实话,即使在实体框架中,我也会使用'Take',除非你真的需要*使用'Top'。当你的问题含糊不清时,它确实无济于事。 – 2013-04-22 08:23:10

1

请看MSDN为例http://msdn.microsoft.com/en-GB/library/bb155995.aspx

using (AdventureWorksEntities context = 
    new AdventureWorksEntities()) 
{ 
    string queryString = 
     @"SELECT VALUE product FROM AdventureWorksEntities.Products AS product"; 

    ObjectQuery<Product> productQuery1 = 
     new ObjectQuery<Product>(queryString, context, MergeOption.NoTracking); 

    ObjectQuery<Product> productQuery2 = productQuery1.Top("2"); 

    // Iterate through the collection of Product items. 
    foreach (Product result in productQuery2) 
     Console.WriteLine("{0}", result.Name); 
} 

或者,如果你只是有List<T>考虑使用Take()扩展名。

List<string> strs = new List<strs>() { "1", "2", "3", "4" }; 
var firstTwo = strs.Take(2);