如何使用Identities列表从Entity Framework获取ObjectResult

我有一个HashSet的Identity值,我需要将其用作查询值以从Entity Framework返回ObjectResult

这是HashSet:

HashSet officeIds = new HashSet(); 

这是我试图或多或少地运行的查询:

 ObjectResult offices = ctx.FilingOffice.Where(office => office IN officeIds.ToList()); 

上面的“office => office IN officeIds.ToList()”部分是我无法工作的,并且在给定主键列表的情况下没有在Web上找到任何用于返回对象的样本。

ctx是System.Data.Objects.ObjectContext

其他人给出的示例今天在entity framework中不起作用,因为您无法在LINQ 2实体中混合使用客户端和服务器端枚举。

相反,您需要手动构建OR表达式。

我运行了一系列EF技巧 , 这个技巧向您展示了如何构建OR表达式。

希望这可以帮助

亚历克斯

我有很多次类似的问题,另一个有良好信息的Stack Overflow问题是: 通过主键获得多个实体的最有效方法?

我更喜欢使用:

 var entities = db.Entities.WhereIn(x => x.Id, ids); 

请尝试以下方法。

 var offices = ctx.FilingOffice.Where(o => officeIds.ToList().Contains(o.Id)); 

但我并不绝对确定entity framework是否支持此查询 – 我倾向于认为您必须将officeIds.ToList()存储在局部变量中。

有一种解决LINQ to Entities限制的替代方法。 您可以使用支持IN子句的Entity SQL。

string entitySql = String.Format("SELECT VALUE O FROM FilingOffice AS O WHERE O.Id IN {{{0}}}", String.Join(",", officeIds.ToList().ConvertAll(officeId => officeId.ToString()).ToArray()));
ObjectQuery offices = new ObjectQuery(entitySql, ctx);

我目前没有办法检查这个,但看起来你正在尝试查看office对象本身是否在列表中,你可能想检查它的ID是否在你拥有的ID列表中,比如

 ObjectResult offices = ctx.FilingOffice.Where(office => office.Id IN officeIds.ToList()); 

如果这不起作用,那么在运行代码时会发生什么情况会有所帮助。

我有类似的问题,我通过内部联接解决。 请参阅下面的function。

 public IEnumerable GetAccountsById(IEnumerable accountIds) { var query = from regAccount in registeredAccounts join Ids in accountIds on regAccount.AccountId equals Ids select regAccount; return query; } 

并在你的cirsumstances

 HashSet officeIds = new HashSet(); ObjectResult offices = from f in ctx.FilingOffice join Ids in officeIds on f.officeId equals Ids select f;