在 SQL 中实现所有功能
Implementing the All functionality in SQL
我正在尝试编写一个 SQL 查询,其中所有特定组都满足条件。
更新
简化的 Table 结构看起来像这样
ID, TitleID, BlockFromSale
---------------------------
1 | 1 | true
2 | 1 | true
3 | 1 | true
4 | 2 | false
5 | 2 | true
此 table 只会 return 项目 TitleID 1。
实际上我只需要标题ID而不是整个项目,但两者都满足条件。
如何在 SQL 中编写此 Linq 查询?
var Query = Data.Items.GroupBy(t => t.TitleID).Where(i => i.All(b => b.BlockFromSale == true));
我尝试查看 Sql 查询,但它立即将其转换为 object。
基本上我只需要一个查询来获取所有 TitleID,每个项目的 BlockFromSale 都设置为 true,因此对于上面 table 中的示例,它只会 return TitleID,1
可以使用查询的 Log
属性 查看生成的 SQL LINQ 查询。 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);
}
如果你想检查集合中所有行的谓词p
,你可以写
NOT EXISTS (... WHERE NOT(p))
因为All(p) == !Any(!p)
在伪语法中。
我猜 ORM 也是这样做的。
没有一种简单的方法可以满足您的要求,但使用子查询是一种简单但速度较慢的方法
SELECT DISTINCT i.TitleID
FROM Items i
WHERE i.TitleID not in
(SELECT DISTINCT TitleID
FROM items it
WHERE it.BlockFromSale = 0)
因此它将删除具有错误的 titleids。
我正在尝试编写一个 SQL 查询,其中所有特定组都满足条件。
更新 简化的 Table 结构看起来像这样
ID, TitleID, BlockFromSale
---------------------------
1 | 1 | true
2 | 1 | true
3 | 1 | true
4 | 2 | false
5 | 2 | true
此 table 只会 return 项目 TitleID 1。
实际上我只需要标题ID而不是整个项目,但两者都满足条件。
如何在 SQL 中编写此 Linq 查询?
var Query = Data.Items.GroupBy(t => t.TitleID).Where(i => i.All(b => b.BlockFromSale == true));
我尝试查看 Sql 查询,但它立即将其转换为 object。
基本上我只需要一个查询来获取所有 TitleID,每个项目的 BlockFromSale 都设置为 true,因此对于上面 table 中的示例,它只会 return TitleID,1
可以使用查询的 Log
属性 查看生成的 SQL LINQ 查询。 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);
}
如果你想检查集合中所有行的谓词p
,你可以写
NOT EXISTS (... WHERE NOT(p))
因为All(p) == !Any(!p)
在伪语法中。
我猜 ORM 也是这样做的。
没有一种简单的方法可以满足您的要求,但使用子查询是一种简单但速度较慢的方法
SELECT DISTINCT i.TitleID
FROM Items i
WHERE i.TitleID not in
(SELECT DISTINCT TitleID
FROM items it
WHERE it.BlockFromSale = 0)
因此它将删除具有错误的 titleids。