2013-02-11 103 views
3

我有一个列表,我想写一个关于列表的ID的查询包含特定的表ID。Linq包含在一个查询

我写这篇文章和运行真实的,但我想写都在同一个查询..

List<int> tempList=yetkiUygulamaList.Select(y => y.Id).ToList(); 
query = query.Where(x => tempList.Contains(x.Uygulama.Id)); 

错误查询

query = query.Where(x => yetkiUygulamaList.Select(y =>y.Id).ToList().Contains(x.Uygulama.Id)); 
+0

在“错误查询”中,如果删除'.ToList()'会发生什么? – 2013-02-11 13:11:50

回答

0

ToList()通过执行查询materilizes,后面还有NHibernate没有办法理解第一个查询应该被包含为子查询。

只需卸下无用ToList():

IQueryable<int> tempList = yetkiUygulamaList.Select(y => y.Id); // removed here 
query = query.Where(x => tempList.Contains(x.Uygulama.Id)); 

上面的代码将生成单个SQL查询。如果你想坚持这一切在一个C#代码行,刚刚摆脱中介变量:

query = query.Where(x => yetkiUygulamaList.Select(y => y.Id).Contains(x.Uygulama.Id)); 
+0

这个查询执行,但我想写一个查询来解决它。感谢您的建议 – altandogan 2013-02-11 13:54:26

+0

@ user990513不知道您的目标是什么......我展示的代码将生成单个SQL查询。如果你想要更少的C#代码行,你可以删除中间变量。我已经用这个更新了我的答案。 – 2013-02-11 14:19:39

0

这必须工作

query = query.Where(x => yetkiUygulamaList.Any(y=>y.Id == x.Uygulama.Id)); 
+0

发生同样的错误。 “System.NotSupportedException:不支持指定的方法。”查询是一个IQueryable变量。 – altandogan 2013-02-11 13:48:18

0

可以执行加入,它会更简单和适合你的情况。

如果我的理解,query是一类的“收藏”(姑且称之为AObj)包含一个属性Uygulama和类Uygulama包含一个属性IdyetkiUygulamaList是的Uygulama

//will return a IEnumerable<AObj> 
IEnumerable<AObj> query = query.Join(yetkiUygulamaList, a => a.Uygulama.Id, u => u.Id, (a,u)=>a); 
“收藏”