这个SQL可以翻译成LINQ吗?
我正在处理一个非常棘手的SQL查询,我想将其转换为LINQ 你认为有可能吗这个SQL可以翻译成LINQ吗?,sql,sql-server,linq,Sql,Sql Server,Linq,我正在处理一个非常棘手的SQL查询,我想将其转换为LINQ 你认为有可能吗 WITH ConditionalChecks AS ( SELECT c.ItemId FROM ConditionalProperties c, Properties p WHERE c.PropertyId = p.Id AND c.IsChecked = 1 AND ( (p.SystemName = 'eatable') OR (p.SystemName = 'd
WITH ConditionalChecks AS (
SELECT c.ItemId FROM ConditionalProperties c, Properties p
WHERE c.PropertyId = p.Id AND c.IsChecked = 1 AND (
(p.SystemName = 'eatable') OR
(p.SystemName = 'diy')
)
),
ConditionalCount AS (
SELECT ItemId, Count(*) AS NumTrue FROM ConditionalChecks
GROUP BY ItemId
),
ItemResult AS (
SELECT * FROM ConditionalCount c, Items i
WHERE c.ItemId = i.Id
)
SELECT * FROM ItemResult
WHERE NumTrue = 2
任何提示都将不胜感激 我认为这样做应该行得通
Select * FROM (
Select c.ItemID, Count(*) As NumTrue
FROM ConditionalProperties c, Properties p
WHERE c.PropertyId = p.Id AND c.IsChecked = 1 AND (
(p.SystemName = 'eatable') OR
(p.SystemName = 'diy')
GROUP BY ItemID
) AS ConditionalCount
INNER JOIN Items AS I
ON ConditionalCount.ItemID = I.id
WHERE ConditionalCount.NumTrue = 2
这是SQL,我不知道为什么我认为您在使用LINQ,并且想要SQL,但这是一种更简单的SQL形式,它应该和您的多个查询做完全相同的事情。我认为类似的事情应该可以工作
Select * FROM (
Select c.ItemID, Count(*) As NumTrue
FROM ConditionalProperties c, Properties p
WHERE c.PropertyId = p.Id AND c.IsChecked = 1 AND (
(p.SystemName = 'eatable') OR
(p.SystemName = 'diy')
GROUP BY ItemID
) AS ConditionalCount
INNER JOIN Items AS I
ON ConditionalCount.ItemID = I.id
WHERE ConditionalCount.NumTrue = 2
这是SQL,我不知道为什么我认为您在使用LINQ,并希望使用SQL,但这是一种更简单的SQL形式,它应该和您的多个查询做完全相同的事情。LINQ使像这样聚合查询变得很容易
var conditionalChecksQuery =
from c in db.ConditionalProperties
where c.IsChecked == 1 // or 'true', if boolean
join p in db.Properties on c.PropertyId equals p.Id
where p.SystemName == "eatable" || p.SystemName == "diy"
select c.ItemId;
var conditionalCountQuery =
from c in conditionalChecksQuery
group c by c.ItemId into cGrouped
select new { ItemId = cGrouped.Key, NumTrue = cGrouped.Count() };
var itemResultQuery =
from c in conditionalCountQuery
join i in db.Items on c.ItemId equals i.Id
select new { Item = i, NumTrue = c.NumTrue };
var finalQuery =
from result in itemResultQuery
where result.NumTrue == 2
select result;
LINQ使得像这样聚合查询变得很容易
var conditionalChecksQuery =
from c in db.ConditionalProperties
where c.IsChecked == 1 // or 'true', if boolean
join p in db.Properties on c.PropertyId equals p.Id
where p.SystemName == "eatable" || p.SystemName == "diy"
select c.ItemId;
var conditionalCountQuery =
from c in conditionalChecksQuery
group c by c.ItemId into cGrouped
select new { ItemId = cGrouped.Key, NumTrue = cGrouped.Count() };
var itemResultQuery =
from c in conditionalCountQuery
join i in db.Items on c.ItemId equals i.Id
select new { Item = i, NumTrue = c.NumTrue };
var finalQuery =
from result in itemResultQuery
where result.NumTrue == 2
select result;
它看起来不像我看到的SQL,所以我想我的大脑出于某种原因改变了它。奇怪。这是可行的,但这只是编写完全相同的SQL的另一种方式。我在找林克的翻译:)是的,我想周末我的大脑会关闭。无论如何,可能SQL的简单形式更容易转换为LINQ。对不起,我对林克不太熟悉,所以我帮不了你。我把这件事留了下来,这样也许另一个对LINQ更为熟练的海报可以更轻松地将查询转换为LINQ。我看到它不像SQL,所以我想我的大脑只是出于某种原因切换了它。奇怪。这是可行的,但这只是编写完全相同的SQL的另一种方式。我在找林克的翻译:)是的,我想周末我的大脑会关闭。无论如何,可能SQL的简单形式更容易转换为LINQ。对不起,我对林克不太熟悉,所以我帮不了你。我把这件事留着,这样也许另一个对LINQ更流利的海报可以更轻松地将查询转换为LINQ。谢谢Ben,这正是我想要的。我从中学到了很多,谢谢:)本,我有一个疑问。如果我们使用LINQ,我们希望将所有内容都保存在单独的obj中并执行操作。因此,与SQL过程相比,它将降低执行速度?SQL过程具有计划缓存的优势,但在LINQ中执行此操作不应再慢。我不确定你的意思是不是要一个接一个地执行查询,但如果是这样的话,它们就不是:只有在最后一个查询被枚举时,整个查询才会转换为SQL并执行一次。没问题。这是许多关于这个特性的文章中的一篇,叫做“延迟执行”:谢谢Ben,这正是我想要的。我从中学到了很多,谢谢:)本,我有一个疑问。如果我们使用LINQ,我们希望将所有内容都保存在单独的obj中并执行操作。因此,与SQL过程相比,它将降低执行速度?SQL过程具有计划缓存的优势,但在LINQ中执行此操作不应再慢。我不确定你的意思是不是要一个接一个地执行查询,但如果是这样的话,它们就不是:只有在最后一个查询被枚举时,整个查询才会转换为SQL并执行一次。没问题。以下是关于该功能的众多文章之一,称为“延迟执行”: