在一个查询中收集两个 linq 查询

Collect two linq queries in one query

我有以下entity framework方法

maList = (from p in db.full
                  where (p.mc_object.Contains(str))
                  group p by p.mc_object into g
                  orderby g.Count() descending
                  select new StringIntType
                  {
                      str = g.Key,
                      nbr = g.Count(),
                      par="object"
                  }).ToList();

maList = (from p in db.full
                  where (p.mc_owner.Contains(str))
                  group p by p.mc_owner into g
                  orderby g.Count() descending
                  select new StringIntType
                  {
                      str = g.Key,
                      nbr = g.Count(),
                      par="owner"
                  }).ToList();

我想在一次查询中完成。

您可以使用 Concat:

var objects = from p in db.full
              where (p.mc_object.Contains(str))
              group p by p.mc_object into g
              orderby g.Count() descending
              select new StringIntType
              {
                  str = g.Key,
                  nbr = g.Count(),
                  par="object"
              };

var owner = from p in db.full
            where (p.mc_owner.Contains(str))
            group p by p.mc_owner into g
            orderby g.Count() descending
            select new StringIntType
            {
                str = g.Key,
                nbr = g.Count(),
                par="owner"
            };

maList = objects.Concat(owner).ToList();

这看起来不像是一个查询,但由于 LINQ 的延迟执行,只有一个查询被发送到位于 ToList() 的数据库。

可以使用联合方式

maList = (from p in db.full
              where (p.mc_object.Contains(str))
              group p by p.mc_object into g
              orderby g.Count() descending
              select new StringIntType
              {
                  str = g.Key,
                  nbr = g.Count(),
                  par="object"
              })
              .Union(from p in db.full
              where (p.mc_owner.Contains(str))
              group p by p.mc_owner into g
              orderby g.Count() descending
              select new StringIntType
              {
                  str = g.Key,
                  nbr = g.Count(),
                  par="owner"
              }).ToList();