Linq to sql 中的LINQ子查询
我是一个有IQueryable、lambda表达式和LINQ的新手。我想在where子句中放置一个子查询,如下所示: 示例代码: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_
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))