【发布时间】:2016-04-12 23:58:46
【问题描述】:
我有一个带有COLOURS 类类型的IQueryable 列表
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;
}
【问题讨论】:
-
这可能会或可能不会影响最终查询。您还可以显示悬停
result时显示的查询吗?我希望像SELECT TOP 2 * FROM (SELECT TOP 200 * FROM ...)这样的东西。 -
@theEmge:很多人都想在这里帮助你,他们都在说“给我看代码”。他们想要代码,以便他们可以重现您的症状,以便找出问题所在。请停止将部分代码 sn-ps 放入 cmets - 将整个代码放入问题中,否则您只是在浪费每个人的时间。如果您可以将代码精简为仍然存在问题的更简单的代码,那就更好了。
-
这看起来像 System.Linq.Enumerable 上的 Take() 扩展方法,但真的是这样吗?它可能是不同类上的另一个同名方法吗?请发布您的所有代码,包括引用/“使用”语句和 DefaultColours() 方法。
-
@Neil 这实际上可能会发生,我认为编译器会警告您歧义,但我只是测试了它,显然它没有。 OP 应该尝试用
System.Linq.Enumerable.Take<string>(renkler.OrderBy(o => Guid.NewGuid()), 2);替换renkler.OrderBy(o => Guid.NewGuid()).Take(2);以确保。 -
实现
DefaultColours()也很好,因为它是一个 IQueryable。 -- @Neil:它是Queryable.Take()-扩展,而不是Enumerable.Take()。
标签: c# entity-framework linq lambda