C# 林克联盟和塔克
我试图从具有不同类别的DB表中获取记录。我想从每一级随机抽取一条记录 我尝试通过以下方式实现此目标:C# 林克联盟和塔克,c#,linq-to-sql,C#,Linq To Sql,我试图从具有不同类别的DB表中获取记录。我想从每一级随机抽取一条记录 我尝试通过以下方式实现此目标: var results = (from o in db.tblName where o.category== 1 orderby Guid.NewGuid() select o).Take(1).Union (from o in db.tblName
var results = (from o in db.tblName
where o.category== 1
orderby Guid.NewGuid()
select o).Take(1).Union
(from o in db.tblName
where o.category == 2
orderby Guid.NewGuid()
select o).Take(1).Union
(from o in db.tblName
where o.category == 3
orderby Guid.NewGuid()
select o).Take(1).Union
(from o in db.tblName
where o.category == 4
orderby Guid.NewGuid()
select o).Take(1);
使用上述代码将获取1条记录,而不是4条记录
我做错了什么?这是因为每个
取
都应用于链中所有前面的并集
的结果,即
a.Take(1).Union(b).Take(1)
您需要在Take
s中添加括号,以确保
a.Take(1).Union(b.Take(1))
您的查询应如下所示:
var results =
((from o in db.tblName where o.category== 1 orderby Guid.NewGuid() select o).Take(1))
.Union((from o in db.tblName where o.category == 2 orderby Guid.NewGuid() select o).Take(1))
.Union((from o in db.tblName where o.category == 3 orderby Guid.NewGuid() select o).Take(1))
.Union((from o in db.tblName where o.category == 4 orderby Guid.NewGuid() select o).Take(1));
您可以进一步简化查询,如下所示:
var categories = new[] {1, 2, 3, 4};
var result = categories.Select(
c => (from o in db.tblName where o.category==c orderby Guid.NewGuid() select o).Take(1)
).Distinct();
这是因为每个
Take
应用于链中所有前面的Union
s的结果,即
a.Take(1).Union(b).Take(1)
您需要在Take
s中添加括号,以确保
a.Take(1).Union(b.Take(1))
您的查询应如下所示:
var results =
((from o in db.tblName where o.category== 1 orderby Guid.NewGuid() select o).Take(1))
.Union((from o in db.tblName where o.category == 2 orderby Guid.NewGuid() select o).Take(1))
.Union((from o in db.tblName where o.category == 3 orderby Guid.NewGuid() select o).Take(1))
.Union((from o in db.tblName where o.category == 4 orderby Guid.NewGuid() select o).Take(1));
您可以进一步简化查询,如下所示:
var categories = new[] {1, 2, 3, 4};
var result = categories.Select(
c => (from o in db.tblName where o.category==c orderby Guid.NewGuid() select o).Take(1)
).Distinct();
如果我正确理解你的要求,你就不能这样做吗
Random rnd = new Random();
var results = db.tblName.GroupBy( q => q.category )
.Select( g => g.ElementAt(rnd.Next(0, g.Count())) ).ToList();
如果我正确理解你的要求,你就不能这样做吗
Random rnd = new Random();
var results = db.tblName.GroupBy( q => q.category )
.Select( g => g.ElementAt(rnd.Next(0, g.Count())) ).ToList();
你在那里做的最后一件事是采取(1)你在那里做的最后一件事是采取(1)