从带有约束的数据库中随机选择的数据

时间:2014-08-20 02:32:11

标签: c# mysql entity-framework

我创建了一个包含大量产品及其成本的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);
                    });
                }
            }

1 个答案:

答案 0 :(得分:0)

这样的事情:

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循环将停止,您将无法获得全部元素。