我正在尝试编写为我的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
。
答案 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]