在一个查询中使用Linq的Contains方法

3

我有一个列表,想要编写一个查询来查找列表中包含特定表id的ids。

我已经编写了以下代码并且运行成功,但是我想把所有内容都写在同一个查询里面:

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));

在“错误的查询”中,如果删除.ToList()会发生什么? - Jens Kloster
3个回答

0
ToList() 方法通过执行查询来实现,之后 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));

这个查询已经执行了,但我想写一个查询来解决它。感谢您的建议。 - altandogan
@user990513 不确定你的目标是什么...我展示的代码将生成一个单独的SQL查询。如果你想要更少的C#代码行,你可以删除中间变量。我已经更新了我的答案。 - Oskar Berggren

0

这一定要能够运行

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

发生了相同的错误。"System.NotSupportedException: 指定的方法不受支持。" 查询是一个 IQueryable<Rol> 变量。 - altandogan

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接