Linq to sql 中的LINQ子查询

Linq to sql 中的LINQ子查询,linq-to-sql,in-subquery,Linq To Sql,In Subquery,我是一个有IQueryable、lambda表达式和LINQ的新手。我想在where子句中放置一个子查询,如下所示: 示例代码: SELECT * FROM CLIENT c WHERE c.ETAT IN ( SELECT DDV_COLUMN_VAL FROM DATA_DICT_VAL WHERE TBI_TABLE_NAME = 'CLIENT' AND DD_COLUMN_NAME = 'STATUS' AND DDV_COLUMN_VAL_LANG_DSC_

我是一个有IQueryable、lambda表达式和LINQ的新手。我想在where子句中放置一个子查询,如下所示:

示例代码:

SELECT * FROM CLIENT c WHERE c.ETAT IN (
 SELECT DDV_COLUMN_VAL FROM DATA_DICT_VAL
 WHERE TBI_TABLE_NAME = 'CLIENT' AND DD_COLUMN_NAME = 'STATUS'
           AND DDV_COLUMN_VAL_LANG_DSC_1 LIKE ('ac%'))

如何在LINQ中翻译这一点?

如果您是LINQ新手,您绝对需要两个基本工具。第一个是将大多数T-SQL语句转换为Linq的工具,称为Linqer(
http://www.sqltolinq.com/
)。这应该考虑到你问题中的问题。另一个工具是LinqPad(
http://www.linqpad.net/
)。这将帮助您在练习查询时学习Linq


我经常使用Linqer为我转换T-SQL查询,然后使用LinqPad对其进行微调

与Linq方法语法相同的示例:

from c in db.Client
where (from d in db.DataDictVal 
       where d.TblTableName == "Client" 
         && d.DDColumnName == "Status"
         && dd.DdvColumnValLandDsc1.StartsWith("ac"))
       .Contains(c.Etat)
select c;
var innerquery =  dbcontext.DataDictVal                  
                 .where(x=> x.TbiTableName == myTableNameVariable
                    && x.DdColumnName == "Status"
                    && x.DdbColumnValLangDsc1.StartsWith("ac"))
                 .select(x=>x.DdvColumnVal)

var query = dbcontext.Client
            .where( c=>innerquery.Contains(c.Etat))
注意:

我提供了这个答案,因为当我搜索答案时,我找不到太多解释方法语法中相同概念的答案

所以在将来,它可能会对人们有用,那些像我今天这样的人,在内部搜索方法语法。 谢谢
karthik

仅供参考:您在内部查询中缺少select表达式。我们有一个赢家!非常感谢你。虽然我想多了解一点。你对LINQ、IQueryable和lambda表达式有什么好的阅读建议吗?再次感谢!虽然这对这个确切的场景没有帮助,但我从阅读这些示例中获得了很多好处:。我还从Scott Gu关于Linq to SQL的系列文章中学到了很多东西:对我来说,这是行不通的。Contains(列)创建的EXISTS()与IN()不同。我试图在我的项目中执行此操作,因为它创建EXISTS(),我又返回了大约700行。无法使用返回IQueryable的动态Linq查询。IQueryable没有包含方法或扩展方法。@Triynko,当然它适用于动态查询。您可能缺少using语句。您提到的扩展方法是
System.Linq.Queryable.Contains(此IQueryable源,TSource项)
如果动态查询返回的是非泛型的
IQueryable
,那么您是对的;虽然我们现在所处的领域与OP所要求的相去甚远。我不认为这是必要的,但至少你可以在语法上进行更正。是的,我现在补充这一点,对于那些通常使用linq方法语法的人来说。希望这对他们有用。是的,但在这种情况下,转换并不是真正的火箭科学。但同样,语法不正确(小写)。
var innerquery =  dbcontext.DataDictVal                  
                 .where(x=> x.TbiTableName == myTableNameVariable
                    && x.DdColumnName == "Status"
                    && x.DdbColumnValLangDsc1.StartsWith("ac"))
                 .select(x=>x.DdvColumnVal)

var query = dbcontext.Client
            .where( c=>innerquery.Contains(c.Etat))