【问题标题】:Random row from Linq to Sql with no duplicate从 Linq 到 Sql 的随机行,没有重复
【发布时间】:2014-08-18 06:24:49
【问题描述】:

使用 Linq to SQL 检索具有唯一数据/无重复记录的随机行的最佳(和最快)方法是什么?哦,我更喜欢在 1 个声明中这样做,这可能吗? 我找到了这个relevant question,但我不认为这种方法会产生独特的记录。

到目前为止我已经尝试过了:

//first approach

AirAsiaDataContext LinqDataCtx = new AirAsiaDataContext();
var tes = (from u in LinqDataCtx.users.AsEnumerable()
           orderby Guid.NewGuid()
           select u).Take(5);  

//second approach

var usr = from u in LinqDataCtx.users
          select u;

 int count = usr.Count(); // 1st round-trip
 int index = new Random().Next(count);

 List<user> tes2 = new List<user>();
 for (int i = 0; i < 5; i++)
 {
      tes2.Add(usr.Skip(index).FirstOrDefault()); // 2nd round-trip    
 }

正如您在上面看到的,我尝试了 2 个解决方案,它可以工作,但是上面的代码没有产生唯一记录,有重复的机会。

【问题讨论】:

  • 您可以在 linq 查询中使用 .Distinct() 来获取唯一记录。然后执行Random
  • 你想念一些东西“var usr = from u in LinqDataCtx.users select u;”这部分给了我唯一的记录,问题是当我添加到 tes2 时,它可能会给我重复的记录,因为我仍然使用 usr 作为源。
  • 那么在添加之前,检查一下记录是否已经存在于tes2中。
  • 是的,我也想过,但这不是我想要的,我想要的是通过 linq 随机获取唯一记录,而不是手动检查。
  • 您链接到的问题的答案的第一部分(即 Fake UDF)将以随机顺序对所有记录进行排序,然后选择前 5 个。所以他们只有这样才能返回重复项如果您的表中有重复项。

标签: c# asp.net .net linq linq-to-sql


【解决方案1】:
db.TableName.OrderBy(x=>Guid.NewGuid()).FirstOrDefault();

如果您想获取唯一数据/没有重复记录, 你最好使用另一个列表来存储你已经采取的行。

【讨论】:

  • thx tim,但我想在 1 个语句中获取所有记录且不重复,所以我不需要循环,可能我会删除 .FirstOrDefault()。
猜你喜欢
  • 2010-10-13
  • 1970-01-01
  • 2015-12-12
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多