【发布时间】: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