Выражения инициализации
Выражения инициализации инициализируют новый объект. Поддерживается большинство выражений инициализации, в том числе большинство новых выражений инициализации языков C# 3.0 и Visual Basic 9.0. Запросом LINQ to Entities могут быть инициализированы и возвращены следующие типы.
Коллекция, содержащая ноль, один или несколько объектов типизированных сущностей или проекций сложных типов в модель EDM.
Типы CLR, поддерживаемые моделью EDM.
Встроенные коллекции.
Анонимные типы.
Инициализация анонимных типов показана в следующем примере в синтаксисе выражения запроса.
Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
var salesInfo =
from s in sales
where s.TotalDue >= 200
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("");
}
}
Следующий пример с синтаксисом запроса на основе метода показывает инициализацию анонимного типа:
Using AWEntities As New AdventureWorksEntities()
Dim salesInfo = _
AWEntities.SalesOrderHeader _
.Where(Function(s) s.TotalDue >= 200) _
.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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
var salesInfo =
AWEntities.SalesOrderHeader
.Where(s => s.TotalDue >= 200)
.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("");
}
}
Также поддерживается инициализация определяемого пользователем класса. Поддерживается модель инициализации языков C# 3.0 и Visual Basic 9.0 и предполагается, что метод считывания и метод задания свойства симметричны. В следующем примере синтаксис выражения запроса показывает пользовательский класс, инициализируемый в запросе:
Class MyOrder
Public SalesOrderNumber As String
Public ShipDate As DateTime?
End Class
class MyOrder { public string SalesOrderNumber; public DateTime? ShipDate; }
Using AWEntities As New AdventureWorksEntities()
Dim sales As ObjectQuery(Of SalesOrderHeader) = AWEntities.SalesOrderHeader
Dim salesInfo = _
From s In sales _
Where s.TotalDue >= 200 _
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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
ObjectQuery<SalesOrderHeader> sales = AWEntities.SalesOrderHeader;
IQueryable<MyOrder> salesInfo =
from s in sales
where s.TotalDue >= 200
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("");
}
}
В следующем примере синтаксис запроса на основе метода показывает пользовательский класс, инициализируемый в запросе:
Using AWEntities As New AdventureWorksEntities()
Dim salesInfo As IQueryable(Of MyOrder) = _
AWEntities.SalesOrderHeader _
.Where(Function(s) s.TotalDue >= 200) _
.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
using (AdventureWorksEntities AWEntities = new AdventureWorksEntities())
{
IQueryable<MyOrder> salesInfo =
AWEntities.SalesOrderHeader
.Where(s => s.TotalDue >= 200)
.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("");
}
}