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

时间:2009-06-11 00:18:22

标签: c# entity-framework

我有一个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

6 个答案:

答案 0 :(得分:7)

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

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

我运行了一系列EF Tipsthis 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;