【问题标题】:Studying an Idea for extract random rows with LINQ学习使用 LINQ 提取随机行的想法
【发布时间】:2011-12-07 14:37:03
【问题描述】:

这实际上是我从产品列表中提取(例如)5 个随机产品的策略:

// extracts all products with Name Example
IList<Product> products = (from Product p in new Products()
                           where p.Name = "Example"
                           select p).ToList();

// I randomly order first 5 products
int upper = 1;
if (products.Count > 1)
{
    Random r = new Random();
    upper = Math.Min(5, products.Count);
    for (int i = 0; i < upper; i++)
    {
        int randInd = r.Next(i, products.Count);
        var temp = products[i];
        products[i] = products[randInd];
        products[randInd] = temp;
    }
}

// I get the first 5
products = products.Take(upper);

我不得不说:每次使用 LINQ 提取我需要的所有记录、订购它们并且只得到很少的记录时,我都感到很恼火。

我认为这个过程会浪费资源,例如如果我只需要 5 个,就使用 LINQ 获取所有元素。

有没有一种方法可以仅使用 LINQ 提取表中某个位置的记录?我的意思是,如果我有一个 1000 行的表,那么随机只获取 5 行。

这将是相同的,并且资源的使用将得到改善。

【问题讨论】:

标签: c# linq random


【解决方案1】:

有没有一种方法可以在某个位置仅使用 LINQ 提取记录 在桌子上?

System.Linq.Queryable 类提供了 ElementAt(int) 扩展方法。

【讨论】:

  • 看起来很有趣!但是如果有where,它会循环整个表?
  • 不,它基本上是 Skip(x).Take(1),其中 x 是你的随机数。但是您必须确保不要调用 .ToList() ,因为此语句会将整个表加载到内存中。
  • 嗯,太好了!但是 Y 位置的元素不在 where 子句中是怎么回事?下一个 where 子句=true?我认为这可能是获得 N 个随机值的更快策略。只需用我的值调用 ElementAt N 时间,对吗?
  • 是的:它只搜索查询所涵盖的元素(包括 where 子句)。因此,在您的情况下,您应该调用 5 次 ElementAt 方法(针对数据库的查询更多,但内存使用率更高:在 99.99% 时,性能也会更好)。
  • "对数据库的更多查询" ? LINQ 在我的Products 上工作,它们已经在内存中“下载”...
【解决方案2】:

我会给你一个很棒的概念,使用 Linq 从 MSSQL Server 中提取随机 5 条记录。 首先像这样在你的数据库中创建一个标量值函数

CREATE FUNCTION GetNewId ( ) 
RETURNS uniqueidentifier 
AS 
BEGIN 
    RETURN (SELECT ID FROM RandomView) 
END

请在您的 LINQ dbml 文件中导入此函数。

现在,当您使用 linq 查询从数据库中获取记录时,您将使用

(from p in new ProductsDataContext()
orderby new ProductsDataContext().GetNewId()
select p).Take(5).ToList();

通过使用此查询,您每次通话都会获得 5 条随机记录...

我认为它会帮助你很多...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 2018-07-28
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2021-04-06
    相关资源
    最近更新 更多