Как добавить предложение where к соединению linq (лямбда)?

У меня есть две таблицы базы данных Contact (Id, Name, ...) и ContactOperationalPlaces (ContactId, MunicipalityId), где контакт может быть подключен к нескольким ContactOperationalPlaces.

Я пытаюсь создать запрос (ASP .NET, C #) с помощью IQueryable, который выбирает только все контакты, существующие в таблице ContactOperationalPlaces, с заданным MunicipalityId.

sql-запрос выглядит так:

select * from Contacts c 
right join ContactOperationPlaces cop on c.Id = cop.ContactId 
where cop.MunicipalityId = 301;

С linq он будет выглядеть примерно так:

//_ctx is the context
var tmp = (from c in _ctx.Contacts
             join cop in _ctx.ContactOperationPlaces on c.Id equals cop.ContactId
             where cop.MunicipalityId == 301
             select c);

Итак, я знаю, как это сделать, если бы целью было выбрать все это сразу, но, к сожалению, это не так. Я создаю запрос на основе пользовательского ввода, поэтому я не знаю сразу весь выбор.

Вот как выглядит мой код:

IQueryable<Contacts> query = (from c in _ctx.Contacts select c);
//Some other logic....
/*Gets a partial name (string nameStr), and filters the contacts 
 so that only those with a match on names are selected*/
query = query.Where(c => c.Name.Contains(nameStr);
//Some more logic
//Gets the municipalityId and wants to filter on it! :( how to?
query = query.where(c => c.ContactOperationalPlaces ...........?);

Разница с двумя операторами where заключается в том, что с первым каждый контакт имеет только одно имя, но с последним контакт может содержать несколько рабочих мест ...

Мне удалось найти одно решение, но это решение дает мне неидентифицированный объект, содержащий обе таблицы. И я не знаю, что с этим делать.

query.Join(_ctx.ContactOperationPlaces, c => c.Id, cop => cop.ContactId,
      (c, cop) => new {c, cop}).Where(o => o.cop.municipalityId == 301);

Это выражение возвращает объект System.Linq.Iqueryable <{c: Contact, cop: ContactOperationalPlace}>, и его нельзя преобразовать в Контакты ...

Итак, в этом проблема. Ответ, наверное, довольно прост, но я просто не могу его найти ...

6
задан linnkb 16 December 2011 в 08:50
поделиться