C# 在数据库中查找随机内容-Linq

C# 在数据库中查找随机内容-Linq,c#,linq,C#,Linq,我需要摆脱我如何在数据库中找到一个随机的东西,就像向观众展示的一样,同时它必须能够显示一个时间 通常我都是这样做的 cmd1.CommandText = @"SELECT TOP 1 opgaver.id, opgaver.rigtigsvar, opgaver.overskift, opgaver.svar1, opgaver.svar2, opgaver.svar3, opgaveLydefiler.mp3 FROM opgaver INNER JOIN opgaveLydefil

我需要摆脱我如何在数据库中找到一个随机的东西,就像向观众展示的一样,同时它必须能够显示一个时间

通常我都是这样做的

cmd1.CommandText = @"SELECT TOP 1 opgaver.id, opgaver.rigtigsvar, opgaver.overskift, opgaver.svar1, 
    opgaver.svar2, opgaver.svar3, opgaveLydefiler.mp3 FROM opgaver INNER JOIN opgaveLydefiler ON opgaver.overskift = opgaveLydefiler.navn ORDER BY newid()";
任务和任务声音文件放在一起,使它们像伙伴关系/一样具有内部连接

我曾经尝试过这样做,但我不能让它只显示一个,同时像在数据库中一样随机显示它

Opgaver opgaver = db.opgavers.FirstOrDefault().Take(1);
艾德-我选择这样做

var random = new Random();
    var antalopgaver = db.opgavers.Count();
    var number = random.Next(antalopgaver);

    var randomlySelectedItem = db.opgavers.Skip(number).Take(1).FirstOrDefault();

简而言之,这里有一个想法

假设您对前100条记录感兴趣,例如按添加日期排序的记录。然后尝试生成一个介于0和99之间的随机数,如下所示:

var random = new Random();
var number = random.Next(100);
然后将此数字用作查询的偏移量:

var item = db.opgavers.OrderByDescending(e => e.DateAdded).Skip(number).Take(1).FirstOrDefault();
我建议对First使用FirstOrDefault,因为这样可以处理空数据库的情况,这有时是一种有效状态

我使用Take1是因为我认为这是确保查询包含LIMIT子句的最安全的方法。否则,某些LINQ提供程序可能会以其他方式执行此操作


如果您不能像我所想的那样进行排序,那么正如其他人所指出的,您可以得到查询前的行数,并使用它而不是100。但这是对数据库的另一个查询,有时是正常的,有时不是那么多。

您可以按随机数对记录排序,然后选择第一个:

var random = new Random();
var randomlySelectedItem = 
  db.opgavers.Select(o => new { op = o, sort = random.Next(0,10000) })
             .OrderBy(obj => obj.sort)
             .FirstOrDefault();
将硬编码的10000替换为一个基本上与您的物品计数相对应的数字,而不需要精确计数

给您:

var item = db.opgavers.OrderBy(q=>Guid.NewGuid()).FirstOrDefault();

你的随机代码在C代码中的什么地方?酷!如果您简单解释一下.OrderByq=>Guid.NewGuid的作用,会很有帮助。它与SQL中的orderbynewid完全相同。它为每一行创建一个相当随机的新GUID,然后根据它进行排序。它只适用于中小型桌子。你也可以使用一个伪UDF,就像这里一样:但是它会生成完全相同的代码,在服务器上运行。Guid.NewGuid是否会生成唯一ID的SQL?@Asad Yes,它生成的代码与他最初的代码相同;它将使用SQL Server的NewID函数。它以更复杂的方式执行,但执行方式完全相同。。。它将把SELECT*从表格转换为SELECT TOP1*从SELECT newid转换为c1,从表格顺序转换为c1。它不会使用*,但你明白了。对不起,那应该是从SELECT newid as c1中选择TOP1*,从ORDER BY表中选择*c1@Zolt好吧,但是当我超过99岁的时候呢?那么我是不是应该进去,把它设置成我的数字呢?或者怎么说?@Jesperpersen你能澄清这个问题吗?@ZoltánTamási如果我使用第一个;我的意思是说,我有500个任务,但我只希望其中一个按时间显示,但也就是说,大约一周,我只需要350个任务,所以我宁愿被删除,必须输入代码并编写口语@佐尔坦塔马si@JesperPetersen我建议你可以通过添加日期来订购物品,然后进行100次限制,这就是为什么我写下我认为前100条记录是有兴趣的。我会澄清的。如果我超过10000,我该怎么办?这不会让数据库工作变得更容易,只需要找出数据库中有多少?你可以先数一数。。。或者你可以做一个随机的.Next0,1,因为它返回一个双精度。您不必提供与数据库中的项目数完全相同的随机范围。如果范围越窄,它仍然有效,如果范围越大,效果越好。最后,您可以将解决方案混合在一起,并用Guid.NewGuid替换random.next01000。