C# 林克联盟和塔克

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

我试图从具有不同类别的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
                  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)