如何使用Linq检索选定的行数

时间:2017-04-05 11:05:29

标签: c# linq

我的数据库中包含超过3千行的表。

我想在字符串数组中获取单列详细信息,我需要将此数组发送到第三方api,但数组长度不应超过1000.

所以我需要根据记录发送3/4不同的数组

string[] deviceIds = FirebaseNotificationList.Select(x => x.DeviceID).ToArray();

我需要将string [] deviceIds分成长度为1000的不同字符串数组

如果我使用下面的代码,它只需要前1000行:

string[] deviceIds = FirebaseNotificationList
                             .Select(x => x.DeviceID).Take(1000).ToArray();

如何在不遗漏任何行的情况下这样做?

4 个答案:

答案 0 :(得分:0)

您可以使用Select方法重载,它为结果选择器提供元素索引。然后按index/batchSize进行简单分组会将您的所有商品拆分为所需尺寸的批次:

int batchSize = 1000;
var batches = FirebaseNotificationList
                .Select((fn,i) => new { fn.DeviceID, i })
                .GroupBy(x => x.i / batchSize)
                .Select(g => g.Select(x => x.DeviceID).ToArray());

您还可以使用MoreLINQ Batch来避免创建匿名对象,这些对象在源列表中包含有关其索引的信息

var batches = FirebaseNotificationList
                .Select(fn => fn.DeviceID)
                .Batch(batchSize); // note that batches will be IEnumerable<T>

答案 1 :(得分:0)

批处理可以通过Linq实现,如下所示。

int BatchSize = 1000;
IEnumerable<string> Tail = DeviceIds;
while (Tail.Count() > 0)
{
    var Head = Tail.Take(BatchSize);
    // process Head
    Tail = Tail.Skip(BatchSize);
}

答案 2 :(得分:0)

这已在以下问题得到解答:Create batches in linq

public static class MyExtensions
{
    public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items,
                                                       int maxItems)
    {
        return items.Select((item, inx) => new { item, inx })
                    .GroupBy(x => x.inx / maxItems)
                    .Select(g => g.Select(x => x.item));
    }
}

,用法是:

List<int> list = new List<int>() { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

foreach(var batch in list.Batch(3))
{
    Console.WriteLine(String.Join(",",batch));
}

输出:

  

0,1,2

     

3,4,5-

     

6,7,8

     

9

答案 3 :(得分:0)

  

如果我使用下面的代码,它只需要前1000行:

string[] deviceIds = FirebaseNotificationList
    .Select(x => x.DeviceID).Take(1000).ToArray();

是的,你会的。您可以使用Select的重载来索引结果。例如,如果您有3345条记录,则将其除以批量大小(1000),最后将获得批次0,1,2,3。以下是代码,并附有说明:

int batchSize = 1000;
string[] deviceIds = FirebaseNotificationList
    .Select((x, itemNumber) => new { x.DeviceID, ItemNumber = 
         itemNumber).GroupBy(x => x.ItemNumber / batchSize)
    .Select(g => g.Select(x => x.DeviceID).ToArray());

<强>解释

ItemNumber是给予记录的索引。因此,ItemNumber小于1000的记录除以1000,最终会得到0(整数除法),对于ItemNumber大于1000且小于1999的记录,最终会得到1,依此类推。因此,您将使用范围从0到x的GroupBy结束记录组,其中x将是最后一批的编号。换句话说,每个组将包含每个批次的记录。在最后Select中,您要从每个组中选择记录(批处理)。