如何:构建投影 (LINQ to SQL)
更新:November 2007
下面的示例演示如何将 C# 中的 select 语句和 Visual Basic 中的 Select 语句与其他功能结合使用以构建查询投影。
示例
下面的示例使用 Visual Basic 中的 Select 子句(在 C# 中为 select 子句)返回由 Customers 的联系人姓名组成的序列。
Dim nameQuery = From cust In db.Customers _
Select cust.ContactName
var nameQuery =
from cust in db.Customers
select cust.ContactName;
下面的示例使用 Visual Basic 中的 Select 子句(在 C# 中为 select 子句)和匿名类型返回由 Customers 的联系人姓名和电话号码组成的序列。
Dim infoQuery = From cust In db.Customers _
Select cust.ContactName, cust.Phone
var infoQuery =
from cust in db.Customers
select new { cust.ContactName, cust.Phone };
下面的示例使用 Visual Basic 中的 Select 子句(在 C# 中为 select 子句)和匿名类型返回由雇员的姓名和电话号码组成的序列。在产生的序列中,FirstName 和 LastName 字段组合成单个字段 (Name),HomePhone 字段重命名为 Phone。
Dim info2Query = From emp In db.Employees _
Select Name = emp.FirstName & " " & emp.LastName, _
Phone = emp.HomePhone
var info2Query =
from emp in db.Employees
select new
{
Name = emp.FirstName + " " + emp.LastName,
Phone = emp.HomePhone
};
下面的示例使用 Visual Basic 中的 Select 子句(在 C# 中为 select 子句)和匿名类型返回由所有 ProductID 和名为 HalfPrice 的计算所得的值组成的序列。此值设置为 UnitPrice 的 1/2。
Dim specialQuery = From prod In db.Products _
Select prod.ProductID, HalfPrice = CDec(prod.UnitPrice) / 2
var specialQuery =
from prod in db.Products
select new { prod.ProductID, HalfPrice = prod.UnitPrice / 2 };
下面的示例使用 Visual Basic 中的 Select 子句(在 C# 中为 select 子句)和一个条件语句返回由产品名和产品可用性组成的序列。
Dim prodQuery = From prod In db.Products _
Select prod.ProductName, Availability = _
If(prod.UnitsInStock - prod.UnitsOnOrder < 0, _
"Out Of Stock", "In Stock")
var prodQuery =
from prod in db.Products
select new
{
prod.ProductName,
Availability =
prod.UnitsInStock - prod.UnitsOnOrder < 0
? "Out Of Stock" : "In Stock"
};
下面的示例使用 Visual Basic Select 子句(在 C# 中为 select 子句)和一个已知类型 (Name) 返回由雇员的姓名组成的序列。
Public Class Name
Public FirstName As String
Public LastName As String
End Class
Dim db As New Northwnd("c:\northwnd.mdf")
Dim empQuery = From emp In db.Employees _
Select New Name With {.FirstName = emp.FirstName, .LastName = _
emp.LastName}
public class Name
{
public string FirstName = "";
public string LastName = "";
}
void empMethod()
{
Northwnd db = new Northwnd(@"c:\northwnd.mdf");
var empQuery =
from emp in db.Employees
select new Name
{
FirstName = emp.FirstName,
LastName = emp.LastName
};
}
下面的示例使用 Visual Basic 中的 Select 和 Where(在 C# 中为 select 和 where)返回由位于伦敦的客户的联系人姓名组成的筛选序列。
Dim contactQuery = _
From cust In db.Customers _
Where cust.City = "London" _
Select cust.ContactName
var contactQuery =
from cust in db.Customers
where cust.City == "London"
select cust.ContactName;
下面的示例使用 Visual Basic 中的 Select 子句(在 C# 中为 select 子句)和匿名类型返回有关客户的数据的成形子集。
Dim custQuery = From cust In db.Customers _
Select cust.CustomerID, CompanyInfo = New With {cust.CompanyName, _
cust.City, cust.Country}, ContactInfo = _
New With {cust.ContactName, cust.ContactTitle}
var custQuery =
from cust in db.Customers
select new
{
cust.CustomerID,
CompanyInfo = new { cust.CompanyName, cust.City, cust.Country },
ContactInfo = new { cust.ContactName, cust.ContactTitle }
};
下面的示例使用嵌套查询返回以下结果:
由所有订单及其对应的 OrderID 组成的序列。
由订单中具有折扣的项组成的子序列。
不含运费时节省的资金数额。
Dim ordQuery = From ord In db.Orders _
Select ord.OrderID, DiscountedProducts = _
(From od In ord.OrderDetails _
Where od.Discount > 0.0 _
Select od), _
FreeShippingDiscount = ord.Freight
var ordQuery =
from ord in db.Orders
select new
{
ord.OrderID,
DiscountedProducts =
from od in ord.OrderDetails
where od.Discount > 0.0
select od,
FreeShippingDiscount = ord.Freight
};