Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从带有C代码中进一步条件的表中选择随机记录_C#_Sql_Lambda - Fatal编程技术网

C# 从带有C代码中进一步条件的表中选择随机记录

C# 从带有C代码中进一步条件的表中选择随机记录,c#,sql,lambda,C#,Sql,Lambda,我正在编写一个小流程,可以从表中选择随机记录,其中带有复选框/布尔值的字段也未选中。 这个故事的寓意是选择随机记录,使用它并设置checkbox/boolean field==Checked。 我通过从计数方法中选择随机记录来完成这项工作,我得到了整数作为回报,我可以从这个池中选择随机数。但我还需要过滤查询,以仅选择复选框/布尔字段未选中的记录,但我在下面的代码中还没有做到这一点。 我使用了Lambda表达式,如下所示,但可能存在更好的方法 public class Program {

我正在编写一个小流程,可以从表中选择随机记录,其中带有复选框/布尔值的字段也未选中。 这个故事的寓意是选择随机记录,使用它并设置checkbox/boolean field==Checked。 我通过从计数方法中选择随机记录来完成这项工作,我得到了整数作为回报,我可以从这个池中选择随机数。但我还需要过滤查询,以仅选择复选框/布尔字段未选中的记录,但我在下面的代码中还没有做到这一点。 我使用了Lambda表达式,如下所示,但可能存在更好的方法

 public class Program
{
    static void Main(string[] args)
    {
        DatabaseModelContainer mc = new DatabaseModelContainer();
        MyTable myTable = new MyTable();
        Random rnd = new Random();
        int index = rnd.Next(myTable.Count);

        string selectedRec = myTable.MyField.OrderBy(r => myTable.MyField).Take(index).ToString();

        //Selected record to be shown at the screen, but will not appear (only reference point is shown) 
        Console.WriteLine(selectedRec);

        //Selected random value is displayed here and that indeed worked, I get random value there, but I can't use the id to select record above based on that id.
        Console.WriteLine(index.ToString());

        Console.ReadLine();

    }
}
上面的代码没有显示在CheckboxField==Checked的位置选择随机记录的人,因此也需要添加代码。 什么方法最好?

假设MyTable是一个序列,正确的方法应该是:

var randomRecord = myTable
    .Where(x => x.CheckboxField)
    .ToList()
    .OrderBy(x => rnd.Next())
    .FirstOrDefault();
完整示例:

请看这里:


应该能够做到这一点:

var randomNumberGenerator = new Random();
var randomNumber = randomNumberGenerator.Next(myTable.Count(r => r.CheckboxField)) - 1;

myTable
    .Where(r => r.CheckboxField)
    .Skip(randomNumber)
    .Select(r => r.DesiredColumn)
    .FirstOrDefault();

谢谢但是这是否决定了随机记录应该是Checkboxfield==Unchecked?随机记录将只从那些Checkboxfield被选中的记录中选择。如果要从未选中的选项中随机选择,请使用.Wherex=>!x、 改为CheckboxField。我尝试了此操作,但出现了以下错误:EntityFramework.SqlServer.dll中发生了类型为“System.NotSupportedException”的未处理异常。其他信息:LINQ to Entities无法识别方法“Int32 Next”方法,而且此方法无法转换为存储表达式。@Sandri在Where和OrderBy之间添加一个.ToList。谢谢您的帮助。但是没有随机选择,它总是显示第一条记录,它和索引变量有关系吗?嗨,这确实有用,但输出是计数值。我需要选择表中一个字段的值。如何基于随机计数值来实现这一点?然后在跳过后添加一个.Selectr=>r.YourField。这还可以通过使用ToList返回所有结果,避免在内存中填充大量结果。SQL最多返回一个结果,如果表中没有任何内容,则至少返回null。通过doing.Wherex=>x.CheckboxField.ToList,您可以将所有满足该条件的结果返回到内存中,可能很多,也可能不是。我不知道。通过这种方式,您可以将该查询完全卸载到数据库服务器。就目前情况而言,您可能只是为了得到一个结果而将大量数据加载到内存中。
var randomNumberGenerator = new Random();
var randomNumber = randomNumberGenerator.Next(myTable.Count(r => r.CheckboxField)) - 1;

myTable
    .Where(r => r.CheckboxField)
    .Skip(randomNumber)
    .Select(r => r.DesiredColumn)
    .FirstOrDefault();