NHibernate Linq: содержит заявление - PullRequest
0 голосов
/ 19 июля 2010

В качестве примера, скажем, у вас есть такой класс

**Person**
int PersonID
string PersonName
BusinessLocation Locations

**BusinessLocation**
string city
string state
List<int> ZipCodes

(говоря, что местоположения могут существовать в нескольких почтовых индексах) (также игнорируя, что почтовые индексы должны быть строками, а не целыми, это всего лишь пример)

Скажите, что местоположения предприятий существуют в нескольких почтовых индексах.

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

Например, я хочу, чтобы все люди имели почтовый индекс 32567.

(учитывая списокИдентификаторы, это работает, я пытаюсь сделать наоборот, учитывая один идентификатор, я хочу список людей)

public Person GetPersonsByBusinessZipCode(int zipcode)
{
    List<Person> personList = 
        this.GetAllQueryable().Where(
            x => x.Locations.ZipCodes.Contains(zipcode)).ToList();
}

Это отображается как на Fluent.

HasMany<int>(x => x.ZipCodes)
   .Table("BusinessLocationsZipCodes")
   .KeyColumns.Add("BusinessLocationID")
   .Inverse()
   .Element("ZipCode")
   .AsBag()
   .Cascade.None()
   .Cache.ReadOnly();

BusinessLocationZipCodes - это просто справочная таблица, указывающая, что BusinessLocation может иметь несколько ZipCodes, следовательно, HasMany.

Зная, что работает обратное, если мне дают список ZipCodes, и я пытаюсь найти BusinessLocations, содержащиеся в спискеиз почтовых индексов работает (при условии, что сопоставление с почтовым индексом, а не список почтовых индексов).Сейчас я просто пытаюсь найти BusinessLocations по почтовому индексу.

Если у кого-то есть ответ, я был бы признателен.

Ответы [ 3 ]

0 голосов
/ 19 июля 2010

Что за исключение?Это должно работать правильно с использованием последней сборки NHibernate (2.1.2.400).

// Следующий запрос: (не говоря уже о испанском)

0 голосов
/ 19 июля 2010

Пако, по-видимому, я облажался, потому что у меня были две учетные записи, о которых я не знал, так что это мой OpenID один.В любом случае, я не уверен в исключении NullReferenceException, оно погружается в пространства имен NHibernate без обратной связи ни с одним из классов, с которыми я работаю.Но я получаю исключение NullReferenceException, только когда пытаюсь погрузиться в него, используя Contains.Как я утверждаю выше, я не получаю NullReferenceException, если я просто возвращаю список ZipCodes.Таким образом, мое сопоставление работает, но, похоже, оно не возвращает мне список BusinessLocations на основе оператора Contains.

0 голосов
/ 19 июля 2010

Поставщик Linq не должен иметь большого значения, если вы используете System.Linq.Queryable и интерфейс IQueryable.

Я полагаю, что вы ищете метод Queryable.Any.

Persons.Where(p => p.Locations.ZipCodes.Any(z => z == zipCode))

Или, если у вашего Персона много Местоположений:

IQueryable<Person> query =
  from p in Persons
  where
  (
    from l in p.Locations
    from z in l.ZipCodes
    select z
  ).Any(z => z == zipCode)
  select p;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...