2014-07-03 59 views
4
var result=(from refridgerators in context.A            
            group refridgerators by new { refridgerators.Id, refridgerators.Name } into gr 
            select new DAO<String> 
            { 
             Key = gr.Key.Name, 
             Count = gr.Count() 
            }).OrderByDescending(k => k.Count).Take(numberOfRecords).ToList(); 

这是我的LINQ到SQL查询这工作完全正常。LINQ to SQL。如何选择所有记录使用。()

如果我通过numberOfRecords = 5,它会显示前5条记录(按其计数排序)。

现在我的问题是我不想修改查询。所以我应该在上面的查询中显示所有记录。这与我的要求有关,我希望使用相同的查询来显示所有的冰箱和前5名,前10名冰箱。

我不确定是否可以使用LINQ。但我想这肯定是有关系的。

回答

1

由于Tim已经发布了正确的解决方案,我希望将您的注意力放在更简单的解决方案上,如果符合您的要求。 如果条件在此查询的顶部,则再添加一个。

if(allRecordRequired) 
{ 
    numberOfRecords = 2000000; 
} 

让您的查询保持原样。

+0

我会和这一起去的,因为我的数字永远不会超过这个限制,所以我认为暂时适合我的条件 – iGod

1

传递一个巨大的数字给你的方法。一个等于(至少)或大于物品数量的数字。这应该给你所有的记录。

+0

谢谢,有一件事我想问一下,所以这意味着在take()中没有任何默认选择所有记录 – iGod

+0

@ user2010571是的,这就是为什么方法的名称是Take not Select。 –

5

我只是不会将Take添加到查询中,而是添加到您使用此查询的代码中。

因此,例如:

public static IEnumerable<DAO> GetRefrigerators() 
{ 
    var query = from refridgerators in context.A            
       group refridgerators by new { refridgerators.Id, refridgerators.Name } into gr 
       select new DAO<String> 
       { 
        Key = gr.Key.Name, 
        Count = gr.Count() 
       }; 
    return query.OrderByDescending(k => k.Count); 
} 

现在你可以使用:

var refrigerators = GetRefrigerators().Take(5).ToList(); 

var refrigerators = GetRefrigerators().Take(10).ToList(); 

var refrigerators = GetRefrigerators().ToList(); 
+0

谢谢,这是非常有帮助的。所以你的意思是说,我必须选择所有的记录,然后采取最后5,10。所以这将是表现超过头。我跟着这个链接http://stackoverflow.com/questions/5345939/sql-table-paging-performance-is-ef4-linq-skip-take-equal-in-performance-th – iGod

+3

@ user2010571:没有性能开销因为所有方法都使用延迟执行。查询在最后的ToList中执行。所以'Take(10)'将被转换为sql并在数据库中执行。请注意'GetRefrigerators()。ToList()'会将所有*记录加载到'List '中,这会伤害你的记忆(将来)。 –

4

我会做一个numberOfRecords和int?如果该值为空,你不应该叫Take(numberOfRecords)

var result = (from refridgerators in context.A 
       group refridgerators by new { refridgerators.Id, refridgerators.Name } into gr 
       select new DAO<String> 
       { 
       Key = gr.Key.Name, 
       Count = gr.Count() 
       }).OrderByDescending(k => k.Count); 

if(numberOfRecords.HasValue) 
    result = result.Take(numberOfRecords.Value); 

return result.ToList(); 

我知道它改变了你的查询一点点,但我相信这是相当可以接受的,增加了numberOfRecords的一个超高的值增加了对你的查询的窃听,这在你的情况下是无用的。

+0

谢谢。这篇文章很有帮助。这与Tim Schmelter给出的答案很相似。并且我也使用了空值。 – iGod

+0

事实上,答案非常相似,尽管我个人不喜欢返回尚未执行的IEnumerable ,因为当您的代码很难确定执行的位置时变得更大。 – TopinFrassi

+0

我试过这个,并且OrderByDescending()返回一个与Take()不同的类型,这使得'result'不能被重新分配。 我在'OrderByDescending(k => k.Count)'后面加了'.TakeWhile(t => true)'' – Hypersapien

1

所以这个职位是很老了,我知道,但没有提供我的解决方案(也许有人想在2年后达到同样的,像我一样):

你可以创建自己的扩展,方法也与linq 2 sql一起工作。例如:

public static class LinqExtensions 
{ 
    public static IEnumerable<TResult> TakeIfNotNull<TResult>(this IEnumerable<TResult> source, int? count) 
    { 
     return !count.HasValue ? source : source.Take(count.Value); 
    } 
} 

这需要的int?代替int并返回任一源极 - 枚举如果countnull否则返回缺省Take -method的结果。

所以,你可以这样写:

.OrderByDescending(k => k.Count).TakeIfNotNull(numberOfRecords).ToList(); 

如果numberOfCounts为null,它会采取所有记录。