如何用Linq/Lambda编写嵌套SQL查询?含指定SQL转换需求
将嵌套SQL转换为LINQ/Lambda表达式
首先拆解你的SQL逻辑:从sgrc_emisor表筛选出EmisorCuenta为3702406435的记录,同时通过两个子查询从SGRC_ConfigItem表中分别匹配SegmentoId和MarcaId对应的描述字段,最终返回Segmento、Marca、Producto、Familia这几个结果。
LINQ查询表达式写法
假设你使用Entity Framework,上下文对象为dbContext,实体类分别为SgrcEmisor(对应sgrc_emisor表)和SgrcConfigItem(对应SGRC_ConfigItem表),可以这样实现:
var result = from emisor in dbContext.SgrcEmisor where emisor.EmisorCuenta == "3702406435" select new { Segmento = (from config in dbContext.SgrcConfigItem where config.ConfigId == "SEGM" && config.ConfigItemId == emisor.SegmentoId select config.ConfigItemDescripcion).FirstOrDefault(), Marca = (from config in dbContext.SgrcConfigItem where config.ConfigId == "MRCA" && config.ConfigItemId == emisor.MarcaId select config.ConfigItemDescripcion).FirstOrDefault(), emisor.Producto, emisor.Familia };
Lambda表达式写法
如果偏好链式调用的Lambda风格,对应的实现如下:
var result = dbContext.SgrcEmisor .Where(emisor => emisor.EmisorCuenta == "3702406435") .Select(emisor => new { Segmento = dbContext.SgrcConfigItem .FirstOrDefault(config => config.ConfigId == "SEGM" && config.ConfigItemId == emisor.SegmentoId) ?.ConfigItemDescripcion, Marca = dbContext.SgrcConfigItem .FirstOrDefault(config => config.ConfigId == "MRCA" && config.ConfigItemId == emisor.MarcaId) ?.ConfigItemDescripcion, emisor.Producto, emisor.Familia });
补充说明
- 使用
FirstOrDefault()是因为原SQL中子查询无匹配项时会返回NULL,对应Linq里找不到结果时返回默认值(引用类型为null)。 - 如果你的实体类属性名称和数据库字段名不完全一致,记得替换成实体类对应的属性名。
- 若需要立即执行查询(而非延迟加载),可以在末尾追加
.ToList()或.FirstOrDefault()等方法。
内容的提问来源于stack exchange,提问作者wrabarias
相关产品推荐
相关产品推荐

