【问题标题】:Implementing the All functionality in SQL在 SQL 中实现 All 功能
【发布时间】:2015-03-09 16:47:28
【问题描述】:

我正在尝试编写一个 SQL 查询,其中某个组的所有成员都满足一个条件。

更新 简化的表结构如下所示

ID, TitleID,  BlockFromSale
---------------------------
1 | 1  | true
2 | 1  | true
3 | 1  | true
4 | 2  | false
5 | 2  | true

此表将仅返回 TitleID 1 的项目。

实际上我只需要标题 ID 而不是整个项目,但两者都满足条件。

如何在 SQL 中编写这个 Linq 查询?

var Query = Data.Items.GroupBy(t => t.TitleID).Where(i => i.All(b => b.BlockFromSale == true));

我尝试查看 Sql Query,但它只是立即将其转换为一个对象。

基本上我只需要一个查询来获取所有 TitleID,每个项目的 BlockFromSale 设置为 true,因此对于上表中的示例,它只会返回 TitleID,1

【问题讨论】:

  • 表结构是什么样的?

标签: c# sql linq aggregate


【解决方案1】:

可以使用查询的Log 属性查看生成的 LINQ 查询 SQL。 How to: Display Generated SQL 显示了一个例子。基本上,网站显示了这个例子:

db.Log = Console.Out;
IQueryable<Customer> custQuery =
    from cust in db.Customers
    where cust.City == "London" 
    select cust;

foreach(Customer custObj in custQuery)
{
    Console.WriteLine(custObj.CustomerID);
}

【讨论】:

    【解决方案2】:

    如果您想检查谓词 p 的集合的所有行,您可以编写

    NOT EXISTS (... WHERE NOT(p))
    

    因为All(p) == !Any(!p) 在伪语法中。

    我猜 ORM 也是这样做的。

    【讨论】:

    • 如何编写完整的选择?从 i.TitleID 不存在的 i.TitleID 分组的项目中选择 i.TitleID (i.Blockfromsale = 0)?
    • 我一直在到处看到,但我仍然不知道如何使用 groupby 来实现这一点
    • 这和group by根本没有关系。这只是一个谓词,您可以将它放在任何接受谓词的地方。例如在 WHERE 子句中。
    • 感谢您的澄清。你是否知道我可以获取所有物品都设置为 true 以阻止销售的所有 titleids
    【解决方案3】:

    没有一种简单的方法可以满足您的要求,但使用 subQuery 的方法很简单但有些缓慢

    SELECT DISTINCT i.TitleID 
    FROM Items i 
    WHERE i.TitleID not in 
    (SELECT DISTINCT TitleID 
     FROM items it
     WHERE it.BlockFromSale = 0)
    

    所以它会删除有错误的titleid。

    【讨论】:

    • 这正是我想要的
    猜你喜欢
    • 2016-10-26
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-26
    • 2020-09-06
    • 2013-03-29
    • 1970-01-01
    相关资源
    最近更新 更多