2013-05-18 16 views
2

У меня есть объект, называемый драйвер и получить список драйверов, звоню:Доступ к внешнему ключу в LINQ Где?

List<Driver> drivers = _context.Drivers.Select(x=>x); 

Водитель может иметь детали и их внешний ключ между ними, но я не могу сделать:

List<Driver> drivers = _context.Where(x=>x.id == id && x.Detail.id == detailId); 

Как я могу получить доступ к своим свойствам внешнего ключа в моем предложении Where?

Я использую Entity Framework 3.5.

Оператор работает, хотя я не уверен (х => х) необходимо, я на самом деле не был скомпилирован:

List<Driver> drivers = _context.Drivers.Select(x=>x); 

Проблема заключается в том, что Driver предприятие имеет зарубежное отношение к Detail , Driver имеет столбец DetailId, который является внешним ключом к таблице подробностей, и поскольку я использую Entity Framework 3.5, я не могу добраться до Driver.Detail.Id или Driver.DetailId. Они не подходят. Я прочитал что-то около EF 3.5, не включая внешние ключи, а затем имея выбор в EF 4, но на данный момент я нахожусь на EF 3.5.

я стараюсь делать .Include("Detail"), но это дало мне некоторое исключение о Detail not being a navigation property.

+1

Я не понимаю эту проблему. Что это не позволяет вам делать? Какая ошибка дает ваш код в настоящее время? –

+0

Что случилось со вторым статусом Linq? – haim770

+0

Можете ли вы показать свой класс ** Driver **? –

ответ

0

Используйте Include метод в вашем случае. Ref MSDN

+0

Я пробовал, но не уверен даже с MSDN. – Xaisoft

0

Я не знаком с EF 3.5, но, возможно, вы можете решить это следующим образом:

context.drivers.Where(x => x.Detail == 
    context.Details.FirstOrDefault(d => d.Id == detailId)) 
+0

Извините, я исправил часть кода. Я добавил больше деталей, если это поможет. – Xaisoft

+0

Еще одна попытка, пожалуйста, проверьте ... –

0

Вы не можете сделать, потому что _context.Where()_context не IQueryable<Driver>.

Попробуйте вместо _context.Drivers.Where().

Ваш лучший ключ - сообщение об ошибке, которое вы получаете о Detailне являетесь навигационным устройством; попробуйте добавить один к Driver объекта - если это 1 водитель: многие детали:

public virtual ICollection<Detail> Details { get; set; } 

Если это 1 водитель: 1 деталь:

public virtual Detail Detail { get; set; } 

В .dbml можно указать те, с помощью ассоциации; если вы импортировали свою модель из существующего db, FK должны были быть импортированы как ассоциации , но если они не сделали (или если db не определяет их), вы всегда можете добавить их вручную.

С свойства навигации, EF должна быть в состоянии оценить что-то вроде этого:

var driversWithDetails = _context.Drivers 
           .Where(x => x.Id == id && x.Detail.Id == detailId) 
           .Include (x => x.Detail).ToList(); 
+0

Я думаю, что часть 'public virtual Detail' /' ICollection 'относится только к коду EF 4.1. Для EF 3.5 я считаю, что это все в .dbml. –

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