Объединить две таблицы вопроса в linq - PullRequest
0 голосов
/ 15 октября 2018

Я разрабатываю веб-портал для отчетов и обновлений .. Для отображения записей .. Я передаю идентификатор из параметров контроллера ..

Если я получаю данные из одной таблицы, она работает нормально .. Например

Var employee = slp.urlt.where ( x=> x.Id == Id).ToList ();

Но когда я соединяюсь с другой таблицей, это выдает ошибку

var result = from ut in slp.urlt
                     join ct in slp.Cities on ut.City equals ct.Id
                     where ut.Id == Id
                     select new
                     {
                         ut.R_Name_Enn,
                         ut.R_Name_Arr,
                         ut.R_Addr_Enn,
                         ut.R_Addr_Arr,
                         ct.Id,
                         ct.Name,
                         ct.Name_Arr
                     };

Так что я проверил с sql .. следующий запрос работает нормально в sql ..

SELECT A.R_name_e,A.R_name_a,A.R_addr_e,A.R_addr_a,B.Id,B.Name,B.Name_ar FROM urlt A inner join City B on A.City = B.Id WHERE A.Id = 90000001

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Хорошо, у вас есть 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,
        },
    });
0 голосов
/ 15 октября 2018

Я думаю, что вы забыли разместить или преобразовать свой запрос в список.Место для списка в конце.

var result = (from ut in slp.urlt
                     join ct in slp.Cities on ut.City equals ct.Id
                     where ut.Id == Id
                     select new
                     {
                         ut.R_Name_Enn,
                         ut.R_Name_Arr,
                         ut.R_Addr_Enn,
                         ut.R_Addr_Arr,
                         ct.Id,
                         ct.Name,
                         ct.Name_Arr
                     }).ToList();
...