LINQ连接表和计数组

时间:2018-03-08 00:06:38

标签: linq linq-to-sql

我正在尝试编写为我的Entity Framework连接执行此SQL的linq查询:

SELECT 
    l.Site_Name, COUNT(*)
FROM 
    vw_Subnet s
INNER JOIN 
    vw_Lab_Space l ON l.Lab_Space_id = s.Lab_Space_Id
WHERE 
    s.Lab_Space_Id IS NOT NULL 
    AND s.MM_Space_Id IS NOT NULL
GROUP BY 
    l.Site_Name
ORDER BY 
    2 DESC

但我无法弄清楚正确的语法。如果没有WHERE条款我尝试了这个条款,但它实际上并没有GROUP BY部分像我见过的所有示例那样暗示它应该是:

from l in db.vw_Lab_Space.AsNoTracking()
join s in db.vw_Subnet.AsNoTracking()
  on l.Lab_Space_Id equals s.Lab_Space_Id into joined
select new SiteCount {
    Site = l.Site_Name,
    Count = joined.Count()
};

我找回了具有重复网站价值的SiteCount

1 个答案:

答案 0 :(得分:1)

你忘了编写关于你想要达到的目标的规范,但似乎如下。

您有一系列vwLabSpaces,其中每个vwLabSpace都有一个LabSpaceId和一个SiteName。

您还有一系列vwSubnets,其中每个vwSubnet都有一个LabSpaceId

您想在常见的LabSpaceId上加入这两个序列。然后,您希望将连接的元素分组为具有相同SiteName值的元素组(因此一个组中的每个元素都具有相同的SiteName)

最终结果应该是每个组的常见siteNames列表以及每个组中元素的数量。

在婴儿步骤中:

Array.indices

TODO:如果需要,可以制作一个大的LINQ语句。由于懒惰的执行,这不会有所作为。

由于您只使用每个已加入项目的SiteName,因此您无需合并完整的加入对象:

struct Object {
    let name:String
    let goal:String
}

let objects = [Object(name: "John", goal: "a"),Object(name: "Jane", goal: "a"),Object(name: "John", goal: "c"),Object(name: "Pete", goal: "d")]
let nameToBeFound = "John"
let filteredIndices = objects.indices.filter({objects[$0].name == nameToBeFound}) //[0,2]