Хорошо, у вас есть DbContext
с Employees
и Cities
.Каждый Employee
живет в City
;каждый City
является резиденцией ноль или более Employees
.Ясно, что это простое отношение «один ко многим» с использованием внешнего ключа.
Следуя соглашениям о коде начала структуры сущностей , вы получите нечто похожее на следующие классы:
class City
{
public int Id {get; set;}
// every city Houses zero or more Employees:
public virtual ICollection<Employee> Employees {get; set;}
... // other properties
}
class Employee
{
public int Id {get; set;}
// every Employee lives in exactly one City, using foreign key
public int CityId {get; set;}
public virtual City {get; set;}
}
class MyDbContext : DbContext
{
public DbSet<City> Cities {get; set;}
public DbSet<Employee> Employees {get; set;}
}
Поскольку я следую первым соглашениям кода структуры сущностей, структура сущностей будет способна обнаруживать таблицы и столбцы и отношение «один ко многим» между городом и сотрудниками.
Только если вы хотитеиспользуйте нестандартные имена для таблиц или столбцов, вам понадобятся атрибуты или свободный API.
Назад к вашему вопросу
Учитывая Id
, вам нужно несколько свойствEmployee
с этим Id
, включая несколько свойств City
, в котором находится это Employee
Вы можете использовать объединение.Однако если вы используете свойство City
, тогда структура сущностей достаточно умна, чтобы понять, какое соединение необходимо.Код выглядит намного более естественным для читателя:
var queryEmployees = myDbcontext.Employees // from the sequence of all Employees
.Where(employee => employee.Id == Id) // keep only the employee with this Id
.Select(employee => new // from the remaining employees
{ // make one new object with properties:
NameEnn = employee.R_Name_Enn,
NameArr = ut.R_Name_Arr,
AddrEnn = ut.R_Addr_Enn,
AddrArr = ut.R_Addr_Arr,
City = new // I chose to make a sub-property for city
{ // if desired, you can flatten it.
Id = employee.City.Id,
Name = employee.City.Name,
NameArr = employee.City.Name_Arr,
},
});
Я ожидаю, что с этим идентификатором будет только один сотрудник.Чтобы выбрать этого сотрудника, используйте:
var fetchedEmployee = queryEmployees.FirstOrDefault();
или, если вы действительно хотите получить список с этим Employee
:
var fetchedEmployees = queryEmployees.ToList();
Если вы действительно считаете, что объединение более читабельно,и лучше поддерживаемый - в чем я сомневаюсь - вы можете получить тот же результат, используя внутреннее соединение:
var queryEmployees = myDbcontext.Employees // from the sequence of all Employees
.Where(employee => employee.Id == Id) // keep only the employee with this Id
.Select(employee => new // join the remaining employees
.Join(myDbcontext.Cities, // with the sequence of Cities
employee => employee.CityId, // from each Employee take the CityId
city => city.Id // from each City take the Id,
(employee, city) => new // when they match
{ // make one new object with properties:
NameEnn = employee.R_Name_Enn,
NameArr = ut.R_Name_Arr,
AddrEnn = ut.R_Addr_Enn,
AddrArr = ut.R_Addr_Arr,
City = new
{
Id = city.Id,
Name = city.Name,
NameArr = city.Name_Arr,
},
});