Мне нужна помощь с Linq self-join.Linq self-join query
У меня есть следующий classs:
public class Owner
{
public string OwnerId {get;set;}
public string Name {get;set;}
public string Area {get;set;}
public string City {get;set;}
public string Sex {get;set;}
public List<Dog> dog {get;set;}
}
И таблица ....
ID OwnerId OwnerName TypeId TypeName TypeValue TypeCodeId
1 1 John 1 Area United States 440
2 1 John 2 City Los-Angeles 221
3 1 John 3 Sex Female 122
4 2 Mary 1 Area Mexico 321
4 2 Mary 2 City Cancun 345
............................................................
Мне нужно анализировать результаты table1 в списке владельцев самый быстрый способ это возможно. Примечание: Тип может быть нулевым, но мне все еще нужно показать этого владельца (Итак, я полагаю, что левое соединение должно работать).
Вот что я делаю. (Владельцы класс вебсервис, который содержит результаты table1)
public IEnumerable<Owner> GetOwners() {
return (from owner in owners
join area in owners into owner_area
from oa in owner_area.DefaultIfEmpty()
join City in owners into owner_city
from oc in owner_city.DefaultIfEmpty()
join sex in owners into owner_sex
from os in owner_sex.DefaultIfEmpty()
where oa.TypeId == 1 && oc.TypeId ==2 && os.TypeId ==3
select new Owner() {OwnerId = owner.OwnerId,
Name = owner.Name,
Area = oa.TypeValue,
City = oc.TypeValue,
Sex = os.TypeValue}).Distinct();
}
Этот запрос имеет несколько вопросов:
- возвращает несколько результатов и отчетливый не работает, как ожидалось
- Я пытался использовать GroupBy, но он говорит, что не может неявно преобразовать владельца в
IEnumerable <int, Owner>
- это супер медленный
Как я могу получить отдельную запись с самостоятельным подключением и повышением производительности? Благодаря
UPDATE: Спасибо ребята за ваши ansewers, тестирование, но я понял, что я забыл поставить еще одну вещь. Я добавил новый столбец TypeCodeId в макет таблицы (см. Выше). Пользователь может фильтровать значения на основе их выбора. Итак, у меня есть словари TypeCodeId + TypeValue для области, города и пола. Все эти параметры являются необязательными (Если пользователь не выбрал какой-нибудь, я просто показать им все записи.
Итак, предположим, что пользователь выбрал фильтр Area: Unites States
и фильтр City: Los Angeles
им мой запрос будет выглядеть это:
Select Projects where Area equals United States(440) and City equals Los Angeles(221)
Если только площадь: Мексика была выбрана, то мой запрос будет читать что-то вроде этого:
Select Projects where Area equals Mexico(321)
Я m не уверен, как делать необязательные, где предложения с тем, что вы предоставили в примерах.
Is * это * фактическая таблицы? Взять тебя в камеру нормализации. –
Спасибо. Не мой. Я получил его из существующего веб-сервиса. :) – user194076
Дистанционно связанный: [Заменить цикл for-switch с запросом Linq] (http://stackoverflow.com/questions/7607629) – dtb