【问题标题】:Collect two linq queries in one query在一个查询中收集两个 linq 查询
【发布时间】:2015-03-23 13:07:31
【问题描述】:

我有以下实体框架方法

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();

我想在一个查询中生成它们。

【问题讨论】:

  • 您可以删除其中一个查询,然后您将只剩下一个……工作完成。说真的,我们是不是要猜测您想如何组合这些查询?最后你期望什么数据?

标签: c# asp.net linq entity-framework linq-to-sql


【解决方案1】:

你可以使用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() 的数据库。

【讨论】:

  • 效果很好,但是如果我有 4 个查询怎么办,我会使用 .contact(xxxx).concat(yyyy).concat(zzz) 吗?
  • @Redadublex:因为那是不同的表,是的。但这似乎不是最好的数据模型。如果表非常相似,您应该使用一个表和另一列 Type 左右。
  • 是的,我同意,我正在为 sql server 中的另一个查询而苦苦挣扎,如果我解决了它,我会尝试将其转换为 linq
【解决方案2】:

你可以使用Union方法

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();

【讨论】:

  • Union 尝试删除此处不必要的重复项。两者不同,因为一个有par="object",另一个有par="owner"Concat 就像 sql 中的 UNION ALL,实际上它被翻译成那个。
猜你喜欢
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多