Каков самый простой способ вернуть первый набор свойств запроса linq в виде необязательных строк?

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

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;
}

person Bill    schedule 28.04.2020    source источник


Ответы (1)


Анонимный тип — это не то же самое, что кортеж.

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

кортежи 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();
}
person Vadim Martynov    schedule 28.04.2020