我有一个HashSet的Identity值,我需要将其用作从实体框架返回ObjectResult的查询值
这是HashSet:
HashSet<int> officeIds = new HashSet<int>();
以下是我试图或多或少地运行的查询:
ObjectResult<FilingOffice> offices = ctx.FilingOffice.Where(office => office IN officeIds.ToList());
“office =&gt; office IN officeIds.ToList()”上面的部分内容是我无法工作的,并且在给定主键列表的网络上没有找到任何用于撤回对象的样本。
ctx是System.Data.Objects.ObjectContext
答案 0 :(得分:7)
其他人提供的示例今天在Entity Framework中不起作用,因为您无法在LINQ 2实体中混合客户端和服务器端枚举。
相反,您需要手动构建OR表达式。
我运行了一系列EF Tips,this tip向您展示了如何构建OR表达式。
希望这有帮助
亚历
答案 1 :(得分:2)
我有很多次类似的问题,另一个包含良好信息的Stack Overflow问题是:Most efficient way to get multiple entities by primary key?
我更喜欢使用:
var entities = db.Entities.WhereIn(x => x.Id, ids);
答案 2 :(得分:1)
请尝试以下操作。
var offices = ctx.FilingOffice.Where(o => officeIds.ToList().Contains(o.Id));
但我不确定实体框架是否支持此查询 - 我倾向于认为您必须将officeIds.ToList()
存储在本地变量中。
答案 3 :(得分:1)
有一种解决LINQ to Entities限制的替代方法。 您可以使用支持IN子句的实体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);
答案 4 :(得分:0)
我目前没有办法检查这个,但看起来你正在尝试查看office对象本身是否在列表中,你可能想检查它的ID是否在你的ID列表中,喜欢
ObjectResult<FilingOffice> offices = ctx.FilingOffice.Where(office => office.Id IN officeIds.ToList());
如果这不起作用,那么在运行代码时会发生什么情况会有所帮助。
答案 5 :(得分:0)
我有类似的问题,我通过内部联接解决了。请参阅下面的功能。
public IEnumerable<AccountsCache> GetAccountsById(IEnumerable<int> accountIds)
{
var query =
from regAccount in registeredAccounts
join Ids in accountIds on regAccount.AccountId equals Ids
select regAccount;
return query;
}
并在你的第一次会议中
HashSet<int> officeIds = new HashSet<int>();
ObjectResult<FilingOffice> offices =
from f in ctx.FilingOffice
join Ids in officeIds on f.officeId equals Ids
select f;