如何在Entity Framework中使用UNION(concat / union)一次调用?

时间:2016-11-24 20:31:45

标签: c# sql-server entity-framework

我需要在实体框架中执行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?

1 个答案:

答案 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选项好)。