LINQ to SQL.如何使用.take()选择所有记录

Lea*_*ner 5 linq linq-to-entities linq-to-sql

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();
Run Code Online (Sandbox Code Playgroud)

这是我的linq to sql查询,这是完全正常的.

如果我传递numberOfRecords = 5,则显示前5条记录(按其计数排序).

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

我不确定是否可以使用LINQ.但我想必须有一些与此相关的东西.

Mat*_*ger 8

所以这篇文章很旧,我知道,但没有提供我的解决方案(也许有人想在 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);
    } 
}
Run Code Online (Sandbox Code Playgroud)

这需要一个int?代替int并返回源可枚举的如果countnull否则它返回默认方法的结果Take

所以你可以这样写:

.OrderByDescending(k => k.Count).TakeIfNotNull(numberOfRecords).ToList();
Run Code Online (Sandbox Code Playgroud)

如果numberOfCounts为空,它将获取所有记录。


IEa*_*els 6

我将 numberOfRecords 设为 a int?,如果值为 null,则不应调用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();
Run Code Online (Sandbox Code Playgroud)

我知道它会稍微改变你的查询,但我相信它是可以接受的,添加numberOfRecords一个超高值会增加你的查询的偷听,这对你的情况没有用。


Tim*_*ter 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);
}
Run Code Online (Sandbox Code Playgroud)

现在你可以使用:

var refrigerators = GetRefrigerators().Take(5).ToList();
Run Code Online (Sandbox Code Playgroud)

要么

var refrigerators = GetRefrigerators().Take(10).ToList();
Run Code Online (Sandbox Code Playgroud)

要么

var refrigerators = GetRefrigerators().ToList();
Run Code Online (Sandbox Code Playgroud)

  • @ user2010571:没有性能开销,因为所有方法都使用延迟执行.查询在最终的"ToList"中执行.所以`Take(10)`将被翻译成sql并在数据库中执行.请注意,`GetRefrigerators().ToList()`会将*all*记录加载到`List <T>`中,这会损害你的记忆(将来). (3认同)

Rol*_*sta 3

由于蒂姆已经发布了正确的解决方案,如果适合您的要求,我仍然希望您关注更简单的解决方案。在此查询的顶部再添加一个 if 条件。

if(allRecordRequired)
{
  numberOfRecords = 2000000;
}
Run Code Online (Sandbox Code Playgroud)

保留您的查询不变。

  • 一个令人不满意的解决方案,是否没有办法实际指定“全部”? (2认同)