Initialisatie-expressies
Met een initialisatie-expressie wordt een nieuw object geïnitialiseerd. De meeste initialisatie-expressies worden ondersteund, waaronder de meeste nieuwe C# 3.0- en Visual Basic 9.0-initialisatie-expressies. De volgende typen kunnen worden geïnitialiseerd en geretourneerd door een LINQ naar entiteitenquery:
Een verzameling van nul of meer getypte entiteitsobjecten of een projectie van complexe typen die zijn gedefinieerd in het conceptuele model.
CLR-typen die worden ondersteund door entity framework.
Inlineverzamelingen.
Anonieme typen.
Anonieme type initialisatie wordt weergegeven in het volgende voorbeeld in de syntaxis van de query-expressie:
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
In het volgende voorbeeld in de querysyntaxis op basis van een methode wordt anonieme type initialisatie weergegeven:
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
Door de gebruiker gedefinieerde klasse-initialisatie wordt ook ondersteund. Het initialisatiepatroon C# 3.0 en Visual Basic 9.0 wordt ondersteund en gaat ervan uit dat de getter en setter van de eigenschap symmetrisch zijn. In het volgende voorbeeld in de syntaxis van de queryexpressie ziet u een aangepaste klasse die wordt geïnitialiseerd in de query:
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
In het volgende voorbeeld in de op methode gebaseerde querysyntaxis ziet u een aangepaste klasse die in de query wordt geïnitialiseerd:
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