При использовании Entity Framework (EF) лучшим решением является запрос контекста EF с помощью LINQ (http://msdn.microsoft.com/en-us/library/bb308959.aspx). LINQ можно использовать для запроса по взаимосвязям, поэтому в вашем сценарии ваш код будет выглядеть следующим образом:
var joinedlist = context.Student.Join(
// The table we wish to join to the Student table
context.Department,
// Item on student table we want to join from
studentItem => studentItem.DeptId,
// Item on department table we want to join to
departmentItem => departmentItem.Deptd,
// New object just holding the values we wish to retrieve from the joined tables
(studentItem, departmentItem) => new {
StudentId = studentItem.StudentId,
StudentUsername = studentItem.Username,
StudentAddress = studentItem.Address,
DepartmentName = departmentItem.DeptName,
Navigation = StudentItem.NavigationProp1Id
}
);
Приведенный выше код сгенерирует для вас запрашиваемый список, но вы можете многое сделать с LINQ. Например, выбрав подмножество данных и отфильтровав результаты:
var singleItem = joinedlist
// Filter our joined list
.Where(item => item.StudentId.Equals(1))
// Select only a subset of columns
.Select(item => new {item.StudentUsername, item.StudentAddress})
// Return only a single item
.FirstOrDefault();
Что касается производительности - я бы посоветовал приобрести профилировщик, который может показать вам вывод SQL ваших операторов LINQ на EF. Это действительно помогает, когда дело доходит до понимания отложенной загрузки и когда неуместный .ToList () может возвращать всю вашу БД!