Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这个SQL可以翻译成LINQ吗?_Sql_Sql Server_Linq - Fatal编程技术网

这个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

我正在处理一个非常棘手的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 = '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并执行一次。没问题。以下是关于该功能的众多文章之一,称为“延迟执行”: