将LINQ方法语法查询合并为单次数据库调用的实现方案
合并两次LINQ查询为单次数据库调用的解决方案
嘿,这个需求很典型——咱们完全可以把两次查询的逻辑整合到一起,只触发一次数据库调用,避免不必要的往返开销。
核心思路
你现在是先通过ItemID=180拿到对应的ItemName,再用这个名称加上Other=50的条件去查另一条数据的ItemID。我们可以用子查询或者表连接的方式,把这两步逻辑打包成一个LINQ语句,ORM会自动把它翻译成单次SQL查询发送给数据库。
子查询写法(简洁直接)
int targetItemID = Item .Where(x => x.ItemName == Item.Where(i => i.ItemID == 180).Select(i => i.ItemName).FirstOrDefault() && x.Other == 50) .Select(x => x.ItemID) .FirstOrDefault();
如果觉得嵌套子查询看着有点绕,也可以把获取名称的部分单独拎出来(依然是单次数据库调用哦):
// 这里只是定义查询逻辑,还没执行 var targetNameQuery = Item.Where(i => i.ItemID == 180).Select(i => i.ItemName); int targetItemID = Item .Where(x => targetNameQuery.Contains(x.ItemName) && x.Other == 50) .Select(x => x.ItemID) .FirstOrDefault();
表连接写法(更直观)
如果你习惯用JOIN的思路,也可以这么写,逻辑和子查询完全一致:
int targetItemID = Item .Join( // 先筛选出ItemID=180的那条数据 Item.Where(i => i.ItemID == 180), // 主表和子表的关联条件:ItemName相等 mainItem => mainItem.ItemName, nameItem => nameItem.ItemName, // 关联后只保留我们需要的字段 (mainItem, nameItem) => new { mainItem.ItemID, mainItem.Other } ) // 再加上Other=50的过滤条件 .Where(result => result.Other == 50) .Select(result => result.ItemID) .FirstOrDefault();
小提醒
因为你提到Other=50的条件能确保返回唯一结果,所以用FirstOrDefault是完全安全的,不用担心出现多条数据的情况。这几种写法最终都会被EF或者你用的ORM翻译成单次SQL查询,只会和数据库交互一次,完美解决你的需求~
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

