我需要在实体框架中执行UNION,但我只需要对数据库进行一次调用。我知道我可以使用CONCAT / UNION,但它为每个CONCAT / UNION调用数据库,这不是我想要的。我需要使用TOP 4.它太慢了。
这是我的例子......
using (var db = new ApplicationDbContext())
{
var query1 = "SELECT TOP 4 * FROM Products where CategoryID=1";
var query2 = "SELECT TOP 4 * FROM Products where CategoryID=2";
var query3 = "SELECT TOP 4 * FROM Products where CategoryID=3";
IEnumerable<Product> p1 = db.Database.SqlQuery<Product>(query1);
IEnumerable<Product> p2 = db.Database.SqlQuery<Product>(query2);
IEnumerable<Product> p3 = db.Database.SqlQuery<Product>(query3);
IEnumerable<Feed> all = p1.Union(p2).Union(p3);
return all.ToList();
}
如何通过一次通话进行UNION?
答案 0 :(得分:2)
如果你倾向于使用纯LINQ这样做,你可以在组内的值上进行分组,然后排在前4位。
var result = db.Products.GroupBy(p => p.CategoryID).SelectMany(g => g.Take(4));
如果你可以使用两行,你也可以使用编译的查询:
var query = CompiledQuery.Compile<ApplicationDbContext, int, int, IQueryable<Product>>(( ctx, filter, top) => ctx.Products.Where(p => p.CategoryID == filter).Take(top));
var result = query(db, 1, 4).ToList().Union(query(db, 2, 4).ToList()).Union(query(db, 3, 4).ToList()).ToList();
这个将为数据库生成3次往返,但仍然只返回最多12条记录(在我看来,不如groupby选项好)。