Как получить ObjectResult из Entity Framework, используя список идентификаторов - PullRequest
3 голосов
/ 11 июня 2009

У меня есть значения HashSet of Identity, которые мне нужно использовать в качестве значений запроса для возврата ObjectResult из Entity Framework

Вот хэш-набор:

HashSet<int> officeIds = new HashSet<int>();

Вот запрос, который я пытаюсь выполнить более или менее:

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

Часть "office => office IN officeIds.ToList ()", описанная выше, - это то, что я не могу заставить работать, и я не нашел ни одного примера в Интернете для получения объектов с учетом списка первичных ключей.

ctx - это System.Data.Objects.ObjectContext

Ответы [ 6 ]

7 голосов
/ 11 июня 2009

Примеры, которые привели другие, сегодня не будут работать в Entity Framework, потому что вы не можете смешивать перечисления клиентов и серверов в сущностях LINQ 2.

Вместо этого вам нужно создать выражение ИЛИ вручную.

Я запускаю серию EF Tips и , этот совет показывает вам, как построить выражение ИЛИ.

Надеюсь, это поможет

Alex

2 голосов
/ 04 декабря 2013

У меня были подобные проблемы много раз, другой вопрос переполнения стека с хорошей информацией: Самый эффективный способ получить несколько объектов по первичному ключу?

Я предпочитаю использовать:

var entities = db.Entities.WhereIn(x => x.Id, ids);
1 голос
/ 15 июня 2009

Существует альтернативный способ обойти ограничение LINQ to Entities. Вы можете использовать Entity SQL, поддерживающий предложение IN.

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()));<br> ObjectQuery offices = new ObjectQuery(entitySql, ctx);

1 голос
/ 11 июня 2009

Попробуйте следующее.

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

Но я не совсем уверен, поддерживает ли Entity Framework этот запрос - я склонен полагать, что вам придется хранить officeIds.ToList() в локальной переменной.

0 голосов
/ 12 ноября 2009

У меня была похожая проблема, которую я решил с помощью внутреннего соединения. Смотрите мою функцию ниже.

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;
0 голосов
/ 11 июня 2009

У меня нет никаких средств для проверки этого в настоящее время, но похоже, что вы пытаетесь увидеть, находится ли сам объект office в списке, вы, вероятно, хотите проверить, есть ли его идентификатор в списке идентификаторов, которые у вас есть, как

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

Если это не сработает, было бы полезно получить представление о том, что происходит при запуске кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...