Как сопоставить подзапрос в хранимой процедуре в EF Core - PullRequest
0 голосов
/ 17 июня 2020

У нас есть следующие модели (сокращенно для краткости)

public class Patient 
{
    public int Id {get; set;
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public ICollection<Address> Addresses { get; set; } = new List<Address>();
}

public class Address 
{
    public int PatientId {get; set;
    public string Street { get; set; }
    public string Number { get; set; }
    public string Zip { get; set; }
    public string City { get; set; }
}

Нам нравится сопоставлять результаты хранимой процедуры (список пациентов с их адресами) с ними с помощью EF.

select  
    p.* ,
    (select a.street from Addresses as a where a.PatientId = p.id) as addresses
from 
    Patients as p
where 
    ... (a set of clauses and joins to limit the list to the desired patients)

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

Получаем ошибку:

Подзапрос вернул больше чем 1 значение. Это недопустимо, если подзапрос следует за =,! =, <, <=,>,> = Или когда подзапрос используется как выражение.

Есть предложения?

1 Ответ

1 голос
/ 17 июня 2020

Вы не можете вернуть список в столбец в SQL. вы можете объединить данные с da sh - и сохранить в таком столбце, и вы можете Разделить AddressData в c# на - и сохранить в списке.

select  
    p.* ,
    AddressData = COALESCE(STUFF
    (
            (
                select ' - ' + a.street from Addresses as a where a.PatientId = p.id
                   FOR XML PATH('')
            ), 1,2, N''
    ), N'')
from 
    Patients as p
where 
    ... (a set of clauses and joins to limit the list to the desired patients)
public class Patient 
{
    public int Id {get; set;
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string AddressData { get; set; }
    public ICollection<Address> Addresses 
    {
        get 
        {
            return AddressData.Split('-').ToList().Select(a => new Address 
              {
                   Street = a
              }).ToList();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...