c# - Lambda 表达式 order by and take issue

标签 c# entity-framework linq lambda

我有一个 IQueryable 列表,带有 COLOURS 类类型

IQueryable<COLOURS> renkler = dbcontext.colours.Select(s=>new COLOURS{ .... 

我想随机获取 2 行,我正在使用此代码块来执行此操作:

renkler.OrderBy(o => Guid.NewGuid()).Take(2);

我想要 2 行,但有时会变成 3 行或 5 行:

enter image description here

Take(2) 不工作 - 有什么问题?

我检查的时候发现了一些东西

var result = NewProducts().OrderBy(o => Guid.NewGuid()).Take(2);
int result_count = result.Count(); //This value is 2 :D
                                   //but ToList() result 5 :D

整个方法:

public IQueryable<COLOURS> NewProducts() 
{
    DateTime simdi = DateTime.Now;
    DateTime simdi_30 = DateTime.Now.AddDays(-30);

    var collection_products = DefaultColours()
                             .Where(w => ((w.add_date.Value >= simdi_30 && w.add_date.Value <= simdi) || w.is_new == true))
                             .OrderByDescending(o => o.add_date).Take(200)
                             .Select(s => new COLOURS
                             {
                                 colour_code = s.colour_code,
                                 model_code = s.products.model_code,
                                 sell_price = (decimal)s.sell_price,
                                 market_price = (decimal)s.market_price,
                                 is_new = (bool)s.is_new,
                                 product_id = (int)s.product_id,
                                 colour_name = s.name,
                                 product_name = s.products.name,
                                 description = s.products.description,
                                 img_path = s.product_images.FirstOrDefault(f => f.is_main == true).img_path,
                                 category_id = (int)s.category_relations.FirstOrDefault().category_id,
                                 display_order = (short)s.display_order,
                                 section_id = (int)s.products.section_id,
                                 stock_amount = s.pr_sizes.Where(w => w.is_active == true && w.quantity >= 0).Count() > 0 ? (int)s.pr_sizes.Where(w => w.is_active == true && w.quantity >= 0).Sum(s2 => s2.quantity) : 0,
                                                                      section_name = s.products.pr_sections.name,

                             });    
    return collection_products;
}

public IQueryable<COLOURS> RandomNewProducts(int n) 
{
    var result = NewProducts().OrderBy(o => Guid.NewGuid()).Take(n);
    int result_count = result.Count(); //2
    //When I run this method it's getting 5 rows               
    return result;
}

最佳答案

这可能不是您的解决方案,但很难用多行代码和图像格式化评论。

我很确定这是您的数据提供商的问题。也许这个组件没有实现 Take()应该的方式。

我试图重建你的星座但不是任何 IQueryable供应商我建了一个List<>有 500 个对象并称为 AsQueryable()在它上面以满足方法签名。

    public static IQueryable<COLOURS> DefaultColours()
    {
        const int COUNT = 500;

        List<COLOURS> x = new List<COLOURS>();

        var startDate = DateTime.Today.AddDays(-1 * (int)(COUNT / 2));

        // add 500 date values, and use the date and any random bool value
        for (int i = 0; i < COUNT; i++)
            x.Add(new COLOURS() { add_date = startDate.AddDays(i), is_new = i % 3 == 0 });

        return x.AsQueryable();
    }

但是当我这样做时,Take()方法每次总是返回两个(不同的)项目——正如任何人所期望的:

debugger view

关于c# - Lambda 表达式 order by and take issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34674729/

相关文章:

javascript - 在 C# 中以编程方式设置和获取浏览器窗口坐标值 (x,y)

c# - Autofac - 如何创建带参数的生成工厂

c# - 首先使用实体​​框架代码和 IOC 容器来创建没有默认构造函数的实体

javascript - LINQ SingleOrDefault() 等效项

c# - 单元格导航到 GridControl

c# - TextBox LostFocus 事件发生得太频繁

c# - EF 不包括外键使用外类型的最后一个对象

entity-framework - 实体对象用于新添加的对象而不是动态代理 Entity Framework

c# - 修改 Linq 结果

.net - 使用lambda而不是字符串属性名称选择模型属性