Compartir a través de


Expresiones de inicialización

Una expresión de inicialización inicializa un nuevo objeto. Se admiten la mayoría de las expresiones de inicialización, incluidas la mayoría de las nuevas expresiones de inicialización de C# 3.0 y Visual Basic 9.0. Los siguientes tipos se pueden inicializar y devolver mediante una consulta LINQ to Entities:

  • Una colección de cero o más objetos entidad con tipo o una proyección de tipos complejos definidos en el modelo conceptual.

  • Tipos CLR admitidos por Entity Framework.

  • Colecciones insertadas.

  • Tipos anónimos.

La inicialización de tipos anónimos se muestra en el ejemplo siguiente en la sintaxis de la expresión de consulta:

Decimal totalDue = 200;
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    var salesInfo =
        from s in context.SalesOrderHeaders
        where s.TotalDue >= totalDue
        select new { s.SalesOrderNumber, s.TotalDue };

    Console.WriteLine("Sales order numbers:");
    foreach (var sale in salesInfo)
    {
        Console.WriteLine("Order number: " + sale.SalesOrderNumber);
        Console.WriteLine("Total due: " + sale.TotalDue);
        Console.WriteLine("");
    }
}
Dim totalDue = 200
Using context As New AdventureWorksEntities()
    Dim salesInfo = _
        From s In context.SalesOrderHeaders _
        Where s.TotalDue >= totalDue _
        Select New With {s.SalesOrderNumber, s.TotalDue}

    Console.WriteLine("Sales order numbers:")
    For Each sale In salesInfo
        Console.WriteLine("Order number: " & sale.SalesOrderNumber)
        Console.WriteLine("Total due: " & sale.TotalDue)
        Console.WriteLine("")
    Next
End Using

En el ejemplo siguiente de sintaxis de consulta basada en métodos se muestra la inicialización de tipos anónimos:

Decimal totalDue = 200;
using (AdventureWorksEntities context = new AdventureWorksEntities())
{

    var salesInfo =
        context.SalesOrderHeaders
        .Where(s => s.TotalDue >= totalDue)
        .Select(s => new { s.SalesOrderNumber, s.TotalDue });

    Console.WriteLine("Sales order numbers:");
    foreach (var sale in salesInfo)
    {
        Console.WriteLine("Order number: " + sale.SalesOrderNumber);
        Console.WriteLine("Total due: " + sale.TotalDue);
        Console.WriteLine("");
    }
}
Dim totalDue = 200
Using context As New AdventureWorksEntities()

    Dim salesInfo = _
        context.SalesOrderHeaders _
        .Where(Function(s) s.TotalDue >= totalDue) _
        .Select(Function(s) New With {s.SalesOrderNumber, s.TotalDue})

    Console.WriteLine("Sales order numbers:")
    For Each sale In salesInfo
        Console.WriteLine("Order number: " & sale.SalesOrderNumber)
        Console.WriteLine("Total due: " & sale.TotalDue)
        Console.WriteLine("")
    Next
End Using

También se admite la inicialización de clases definidas por el usuario. Se admite el patrón de inicialización de C# 3.0 y Visual Basic 9.0 y se supone que el captador y establecedor de propiedades son simétricos. En el ejemplo siguiente de sintaxis de expresión de consulta se muestra una clase personalizada que se inicializa en la consulta:

class MyOrder { public string SalesOrderNumber; public DateTime? ShipDate; }
Class MyOrder
    Public SalesOrderNumber As String
    Public ShipDate As DateTime?
End Class
Decimal totalDue = 200;
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    IQueryable<MyOrder> salesInfo =
        from s in context.SalesOrderHeaders
        where s.TotalDue >= totalDue
        select new MyOrder
        {
            SalesOrderNumber = s.SalesOrderNumber,
            ShipDate = s.ShipDate
        };

    Console.WriteLine("Sales order info:");
    foreach (MyOrder order in salesInfo)
    {
        Console.WriteLine("Order number: " + order.SalesOrderNumber);
        Console.WriteLine("Ship date: " + order.ShipDate);
        Console.WriteLine("");
    }
}
Dim totalDue = 200
Using context As New AdventureWorksEntities()
    Dim salesInfo = _
        From s In context.SalesOrderHeaders _
        Where s.TotalDue >= totalDue _
        Select New MyOrder With _
               { _
                   .SalesOrderNumber = s.SalesOrderNumber, _
                   .ShipDate = s.ShipDate _
               }

    Console.WriteLine("Sales order info:")
    For Each order As MyOrder In salesInfo
        Console.WriteLine("Order number: " & order.SalesOrderNumber)
        Console.WriteLine("Ship date: " & order.ShipDate)
        Console.WriteLine("")
    Next
End Using

En el ejemplo siguiente de sintaxis de consulta basada en métodos se muestra una clase personalizada que se inicializa en la consulta:

Decimal totalDue = 200;
using (AdventureWorksEntities context = new AdventureWorksEntities())
{
    IQueryable<MyOrder> salesInfo =
        context.SalesOrderHeaders
        .Where(s => s.TotalDue >= totalDue)
        .Select(s => new MyOrder
        {
            SalesOrderNumber = s.SalesOrderNumber,
            ShipDate = s.ShipDate
        });

    Console.WriteLine("Sales order info:");
    foreach (MyOrder order in salesInfo)
    {
        Console.WriteLine("Order number: " + order.SalesOrderNumber);
        Console.WriteLine("Ship date: " + order.ShipDate);
        Console.WriteLine("");
    }
}
Dim totalDue = 200
Using context As New AdventureWorksEntities()

    Dim salesInfo As IQueryable(Of MyOrder) = _
        context.SalesOrderHeaders _
        .Where(Function(s) s.TotalDue >= totalDue) _
        .Select(Function(s) New MyOrder With _
               { _
                   .SalesOrderNumber = s.SalesOrderNumber, _
                   .ShipDate = s.ShipDate _
               })

    Console.WriteLine("Sales order info:")
    For Each order As MyOrder In salesInfo
        Console.WriteLine("Order number: " & order.SalesOrderNumber)
        Console.WriteLine("Ship date: " & order.ShipDate)
        Console.WriteLine("")
    Next
End Using

Consulte también