我有一个 IQueryable
列表,带有 COLOURS
类类型
IQueryable<COLOURS> renkler = dbcontext.colours.Select(s=>new COLOURS{ ....
我想随机获取 2 行,我正在使用此代码块来执行此操作:
renkler.OrderBy(o => Guid.NewGuid()).Take(2);
我想要 2 行,但有时会变成 3 行或 5 行:
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()
方法每次总是返回两个(不同的)项目——正如任何人所期望的:
关于c# - Lambda 表达式 order by and take issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34674729/