Какой самый простой способ вернуть первый набор свойств запроса linq в виде необязательных строк? - PullRequest
0 голосов
/ 29 апреля 2020

Какой самый простой способ вернуть первый набор свойств запроса linq в виде необязательных строк или скрытого типа anonymous to (string ?, string?)? Ниже не работает из-за анонимного объекта.

private (string? HotemName, string? TransportationName) Get3rdPartyHotelTranporationNames(int customerID, int supplierID, System.DateTime? startDate, System.DateTime? endDate) 
{

    var x = (from res in reservations
             join trans in _unitOfWork.tbl_reservations on res.id_pk equals transRes.id
             where trans.status == 4
             select new
             {
                 HotemName = res.Name,
                 TransportationName = trans.Name
             }).Take(1).Single();

    return x;
}

1 Ответ

1 голос
/ 29 апреля 2020

Анонимный тип не совпадает с кортежем.

Анонимные типы предоставляют удобный способ инкапсулировать набор свойств только для чтения в один объект без необходимости явного сначала определите тип. Имя типа генерируется компилятором и недоступно на уровне исходного кода. Тип каждого свойства определяется компилятором.

C# кортежи - это типы, которые вы определяете с использованием облегченного синтаксиса. Преимущества включают в себя более простой синтаксис, правила для преобразования на основе числа (называемого количеством элементов) и типов элементов, а также согласованные правила для копий, тесты на равенство и назначения. Как компромисс, кортежи не поддерживают некоторые объектно-ориентированные идиомы, связанные с наследованием.

Кроме того, вы не можете вернуть анонимный тип из функции. В вашем случае вы должны вернуть новый кортеж из LINQ, как показано в коде ниже:

private (string? HotemName, string? TransportationName) Get3rdPartyHotelTranporationNames(int customerID, int supplierID, System.DateTime? startDate, System.DateTime? endDate) 
{
    return (from res in reservations
             join trans in _unitOfWork.tbl_reservations on res.id_pk equals transRes.id
             where trans.status == 4
             select (res.Name, trans.Name)
             ).Take(1).Single();
}
...