【问题标题】:Linq To SQL - Having and Group ByLinq To SQL - 拥有和分组依据
【发布时间】:2013-08-05 16:49:36
【问题描述】:

我在下面的这个查询工作正常。但是我想使用 Linq 来实现它。

select u.ID, u.NAME
from Task t 
join BuildingUser bu ON bu.ID_BUILDING = t.ID_BUILDING 
join [User] u ON u.ID = bu.ID_USER
where t.ID IN (2,9) AND u.ID != t.ID_USER
group by u.id, u.name
having count(bu.ID_BUILDING) = (SELECT COUNT(t2.ID_BUILDING) FROM Task t2 WHERE t2.ID IN (2,9))

我不知道如何同时分组和使用Having子句。

【问题讨论】:

  • 您应该至少在Where 子句中显示您的LINQ 查询。
  • 请永远不要只删除 SQL 并要求转换为 linq。至少显示 linq-to-sql 图(的相关部分),以便导航属性和关联的多样性可见。
  • @GertArnold 我做得最好,但我做不到;

标签: c# sql linq linq-to-sql sql-to-linq-conversion


【解决方案1】:

你可以试试这样的:

var ids = new[] { 2, 9 };
var results =
    from t in db.Tasks
    join bu in db.BuildingUsers on t.ID_BUILDING equals bu.ID_BUILDING
    group bu by bu.ID_BUILDING into bg
    join u in db.Users on bg.Key equals u.ID
    where ids.Contains(t.ID) && u.ID != t.ID_USER
    group u by new { u.ID, u.NAME } into g
    where bg.Count() == db.Tasks.Count(t2 => ids.Contains(t2.ID))
    select g.Key;

或者如果你的导航属性设置正确,你可以试试这个:

var ids = new[] { 2, 9 };
var results =
    from t in db.Tasks.Where(x => ids.Contains(x.ID))
    from u in t.BuildingUsers.SelectMany(bu => bu.Users)
                             .Where(x => x.ID != t.ID_USER)
    group u by new { u.ID, u.NAME } into g
    where t.BuildingUsers.Count() == db.Tasks.Count(x => ids.Contains(x.ID))
    select g.Key;

【讨论】:

  • 我不能做第二个,因为 BuildingUsers 与 Tasks 没有直接关系。我正在尝试第一个。但是与用户的加入似乎是错误的。如果您按 ID_BUILDING 对 BuildingUser 进行分组,我无法将 bg.key 加入 User.ID。我对吗?我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-19
  • 1970-01-01
  • 2014-04-26
  • 1970-01-01
  • 1970-01-01
  • 2013-07-19
相关资源
最近更新 更多