c# - 这个 LINQ 查询什么时候进入数据库?

标签 c# sql linq select ado.net

我担心这个 LINQ 调用实际上对数据库进行了两次访问(一次用于 Contains,一次用于 ToList),而我真正想要的只是嵌套 select 语句的 SQL 等价物:

var query1 = from y in e.cities where y.zip=12345 select y.Id;
var query2 = from x in e.users where query1.Contains(x.cityId) select x;
List<users> result = query2.ToList();

要点:如果这是两次访问数据库,我该如何避免?我怎样才能拥有这样的嵌套 select 语句,它只会作为一个查询执行一次? Query1 只会返回 1 或 0 行。一定有比使用“包含”更好的方法。

最佳答案

因为 query1query2 都是 IQueryable 所以只有一次访问数据库 - 当你调用 query2.ToList( )

您可以使用连接组合查询,因为您正在寻找相关信息并且关系是用户的城市 ID 与您限制的城市相同:

var result = (from x in e.users 
                join y in e.cities
                on x.cityId equals y.Id
                where y.zip == 12345
                select x.Id).ToList();

上面应该为您提供(大概)居住在邮政编码 12345 中的用户的用户 ID 列表。

关于c# - 这个 LINQ 查询什么时候进入数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7941877/

相关文章:

c# - 如果子节点元素相等,如何添加父节点?

linq - 错误 LINQ 表达式包含对与不同上下文关联的查询的引用

c# - 查找具有特定汉明距离的字符串 LINQ

mysql - 使用左连接并保留左表 ID 的值

mysql - 如何根据 ID 选择 MySQL 行?对性能有影响吗?

mysql - SQL查询忽略条件

c# - 如何将 Python 版本 3 与 .Net 集成

c# - C#中的URL正则表达式

c# - C# 中的 [something] 是什么意思

c# - 使用更新面板转义关键问题