2016-05-19 2 views
1

Я создал ниже два классов с помощью Entity FrameworkEF один ко многим, когда условие

public class Persons 
{ 
    public string Name { get; set; } 
    public int personId { get; set; } 
    //NAVIGATIONL PROP. 
    public virtual ICollection<streetLivedIn> { get; set; } 
} 

public class StreetLivedIn 
{  
    public string Address1 { get; set; } 
    public string AddressType { get; set; } 
    //NAVIGATIONL PROP. 
    public virtual PersonId (Foriegn Key with Person) 
} 

Существует один к многим отношение между Person и улицами Жили In.I пытается вытащить список лиц, чьи AddressType, в streetlivedin таблице, является «Home» .Для этого у меня ниже заявление

var Lstpersons = db.persons() 
        .Include(x => x.streetlivedin) 
        .Where(x => x.streetlivedin.AddressType == "Home"); 

Приведенный выше код выдает ошибку, в котором пункт говоря, что это не может преобразовать ICollection<streetlivein> в streetlivedin класс. не

Я хотел бы знать, как я могу добиться этого с помощью Include и where.And используя Persons контекст. (Я знаю, что это может быть легко достигнуто с помощью streetLivedIn контекст .. как

var Lstpersons = db.streetlivedin() 
        .Include(x => x.person) 
        .Where(x => x.streetlivedin.AddressType == "Home"); 

(Нет присоединиться заявления .... пожалуйста)

+0

Итак, вы в порядке с '.Include()', но не '.Join()'? Позаботьтесь о том, почему? –

+0

@DavidL Мы используем Include в остальной части функциональности кода. Поэтому, чтобы оставаться последовательным ... –

ответ

1
int id=1; 
var Lstpersons=(from s in db.streetlivedins where s.AddressType == "Home" && s.PersonId ==id select s).ToList(); 

Если вы не хотите конкретного адреса пользователя

var Lstpersons=(from s in db.streetlivedins where s.AddressType == "Home" select s).ToList(); 

Если вы хотите лиц

var Lstpersons=(from p in db.persons let st =p.streetlivedins from s in st where s.AddressType == "Home" select p).ToList(); 
+0

Как я упоминал ранее в сообщении .. Я не хочу использовать db.streetlivedins ... Я хотел бы использовать db.persons и это тоже с включением statment..not "from..in ... join .." –

+0

очень странно, почему вы не хотели бы использовать 'db.streetlivedins', вы ничего не выиграете, не используя это, поэтому согласованность использования 'include' или родительской таблицы немного смехотворна. Вы должны сосредоточиться на архитектуре и хранилище для согласованности, а не на этом. –

+0

@ AD.Net Iam, использующий класс репозитория для каждой модели. Я уже создал экземпляр класса репозитория для других функций. Я не хочу, чтобы экземпляр класса репозитория StreetLivedIn просто для этого ... Поэтому я пытаюсь посмотреть, могу ли я acheive using person repository class –

2

Вы пытаетесь получить найти где streetlivedin.AddressType == "Home" но streetlivedin коллекция на лицо субъекта. Вместо этого сделать подзапрос на streetlivedin, например:

var Lstpersons = db.persons() 
        .Include(x => x.streetlivedin) 
        .Where(x => x.streetlivedin.Any(y=>y.AddressType == "Home")); 
+0

не «any» возвращает addresstypes, которые также не являются домашними ... наряду с типом домашнего адреса? –

+0

'Any' возвращает bool для элементов, которые соответствуют выражению, так что, если у человека есть один' streetlivedin' дома, он вернет этого человека. Или вы только после домашних адресов для каждого человека? – Steve

+0

Мне нужен человек вместе с streetLivedIn details..too –

1

Чтобы получить все люди, только их домашний адрес, вы хотите что-то вроде этого запроса.

from person in db.persons() 
join address in db.streetlivedin() on person.personId equals address.PersonId 
where address.AddressType == "Home" 
select new { Person = person, HomeAddress = address } 

Конечно, так как это внутреннее соединение, любой человек с более чем один Домашний адрес будет отображаться больше, чем один раз в результатах.

Как в стороне, смешанная капитализация приведет меня в бешенство, если мне придется работать с этой кодовой базой. Вам не обязательно следовать правилам кодирования C#, но если вы собираетесь выбрать свою собственную конвенцию, по крайней мере, сделать ее последовательной.

Смежные вопросы