如何使用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;