C# 从具有约束的数据库中随机选择的数据

C# 从具有约束的数据库中随机选择的数据,c#,mysql,entity-framework,C#,Mysql,Entity Framework,我创建了一个MySQL数据库,其中包含大量的产品及其成本。我使用EF6包装数据库 根据给定的输入,我需要随机生成符合所述标准的正确选择 例如: 10件,总价值25美元 我不知道如何正确地遍历数据库以生成所需的结果 我目前所做的工作似乎效率低下: using (var db = new Database()) { var packageSelected = false; var random = new Ran

我创建了一个MySQL数据库,其中包含大量的产品及其成本。我使用EF6包装数据库

根据给定的输入,我需要随机生成符合所述标准的正确选择

例如: 10件,总价值25美元

我不知道如何正确地遍历数据库以生成所需的结果

我目前所做的工作似乎效率低下:

using (var db = new Database())
            {
                var packageSelected = false;
                var random = new Random();
                var minItemId = (from d in db.products select d.id).Min();
                var maxItemId = (from d in db.products select d.id).Max();

                var timer = new Stopwatch();

                timer.Start();
                Console.WriteLine("Trying to make package...");

                while (!packageSelected)
                {
                    var currentItems = new List<int>();
                    for (var i = 0; i <= 9; i++)
                    {
                        var randomItem = random.Next(minItemId, maxItemId);
                        currentItems.Add(randomItem);
                    }

                    decimal? packageValue = 0;
                    currentItems.ForEach(o =>
                    {
                        var firstOrDefault = db.products.FirstOrDefault(s => s.id == o);
                        if (firstOrDefault != null)
                        {
                            var value = firstOrDefault.MSRP;
                            packageValue += value;
                        }
                    });
                    if (!(packageValue >= 25) || !(packageValue <= 26)) continue;
                    packageSelected = true;
                    timer.Stop();
                    Console.WriteLine("Took {0} seconds.", timer.Elapsed.TotalSeconds);
                    currentItems.ForEach(o =>
                    {
                        var firstOrDefault = db.products.FirstOrDefault(s => s.id == o);
                        if (firstOrDefault != null)
                            Console.WriteLine("Item: {0} - Price: ${1}", firstOrDefault.DESCRIPTION, 
                                firstOrDefault.MSRP);
                    });
                }
            }

像这样的东西怎么样:

public virtual TEntity GetRandom()
{
      return DBSet.OrderBy(r => Guid.NewGuid()).Take(1).First();
}
public List<TEntity> Random(int amount, int maxprice)
    {
        var list = new List<TEntity>();
        var tempPrice = 0;
        for (int i = 0 ; i < amount; i++)
        {
            var element = GetRandom();
            tempPrice += element.Price;
            if (tempPrice > maxprice)
            {
                return list;
            }
            list.Add(element);
        }
        return list;
    }
希望这有帮助


编辑:如果在所需的元素数量之前达到maxprice,则for循环将停止,您将无法获得全部元素。

如果您的任何项目的成本超过1.01,则您有一个无限循环。i、 e.24.99+1.02==26.01