含Where子查询的LINQ语句编写求助:跨库关联查询场景
没问题,我来帮你捋清楚这个嵌套查询的写法!先结合你的表结构,假设你想要的是从tAccessRequest中筛选出对应CardNo在tBadge里满足特定状态(比如CardStatus为有效)的请求记录——这应该是这类场景最常见的需求,下面给你两种LINQ写法,都用到了嵌套的Where逻辑:
1. 方法语法(更贴合嵌套Where的写法)
如果你习惯链式调用的写法,可以这样实现:
// 假设db1是数据库1的上下文,db2是数据库2的上下文 var targetRequests = db1.tAccessRequest .Where(request => // 嵌套查询:检查当前请求的CardNo是否在tBadge中存在符合状态的记录 db2.tBadge .Where(badge => badge.CardNo == request.CardNo && badge.CardStatus == "有效") .Any() // 判断是否存在匹配的Badge );
这里的逻辑是:遍历每一条tAccessRequest,通过嵌套的Where先筛选出同CardNo且状态符合要求的tBadge记录,再用Any()确认是否存在这样的Badge——如果存在,就保留这条请求。
如果你想简化一点,也可以把嵌套的Where直接合并到Any()的条件里,效果完全一样:
var targetRequests = db1.tAccessRequest .Where(request => db2.tBadge.Any(badge => badge.CardNo == request.CardNo && badge.CardStatus == "有效") );
2. 查询语法(SQL风格,更直观)
如果你偏好SQL式的写法,对应的嵌套查询如下:
var targetRequests = from request in db1.tAccessRequest where ( from badge in db2.tBadge where badge.CardNo == request.CardNo && badge.CardStatus == "有效" select badge ).Any() select request;
这种写法和SQL里的EXISTS子查询逻辑几乎一致,可读性很强。
额外提示
- 确保两个表的
CardNo数据类型完全一致,否则会出现匹配失败的问题; - 如果你的
CardStatus是枚举类型,把示例中的字符串"有效"换成对应的枚举值即可(比如badge.CardStatus == CardStatus.Active); - 要是你需要同时获取
Request和对应的Badge信息,可以考虑用Join,但既然你明确要求用Where嵌套,上面的写法就完全符合需求啦。
内容的提问来源于stack exchange,提问作者user3083221
相关产品推荐
相关产品推荐

