방법: 쿼리 결과 프로젝션(WCF Data Services)
프로젝션은 엔터티의 특정 속성만 응답에서 반환되도록 지정하여 쿼리에서 반환되는 데이터의 양을 줄이는 메커니즘을 제공합니다. $select 쿼리 옵션을 사용하거나 LINQ 쿼리에서 select 절(Visual Basic에서는 Select)을 사용하여 WCF Data Services 쿼리의 결과에 대해 프로젝션을 수행할 수 있습니다. 자세한 내용은 데이터 서비스 쿼리(WCF Data Services)를 참조하십시오.
이 항목의 예제에서는 Northwind 샘플 데이터 서비스 및 자동 생성된 클라이언트 데이터 서비스 클래스를 사용합니다. 이 서비스 및 클라이언트 데이터 클래스는 WCF Data Services 퀵 스타트를 완료하면 만들어집니다.
예제
다음 예제에서는 Customers 엔터티를 새로운 CustomerAddress 형식으로 프로젝션하는 LINQ 쿼리를 보여 줍니다. 이 형식에는 주소 관련 속성과 ID 속성만 포함됩니다. 이 CustomerAddress 클래스는 클라이언트에서 정의되며 클라이언트 라이브러리가 엔터티 형식으로 인식할 수 있도록 특성이 지정됩니다.
' Create the DataServiceContext using the service URI.
Dim context = New NorthwindEntities(svcUri)
' Define an anonymous LINQ query that projects the Customers type into
' a CustomerAddress type that contains only address properties.
Dim query = From c In context.Customers _
Where c.Country = "Germany" _
Select New CustomerAddress With { _
.CustomerID = c.CustomerID, _
.Address = c.Address, _
.City = c.City, _
.Region = c.Region, _
.PostalCode = c.PostalCode, _
.Country = c.Country}
Try
' Enumerate over the query result, which is executed implicitly.
For Each item In query
' Modify the address and mark the object as updated.
item.Address += " #101"
context.UpdateObject(item)
' Write out the current values.
Console.WriteLine("Customer ID: {0} \r\nStreet: {1} " _
& "\r\nCity: {2} \r\nState: {3} \r\nZip Code: {4} \r\nCountry: {5}", _
item.CustomerID, item.Address, item.City, item.Region, _
item.PostalCode, item.Country)
Next
' Save changes to the data service.
context.SaveChanges()
Catch ex As DataServiceQueryException
Throw New ApplicationException( _
"An error occurred during query execution.", ex)
End Try
// Create the DataServiceContext using the service URI.
NorthwindEntities context = new NorthwindEntities(svcUri);
// Define an anonymous LINQ query that projects the Customers type into
// a CustomerAddress type that contains only address properties.
var query = from c in context.Customers
where c.Country == "Germany"
select new CustomerAddress {
CustomerID = c.CustomerID,
Address = c.Address,
City = c.City,
Region = c.Region,
PostalCode = c.PostalCode,
Country = c.Country};
try
{
// Enumerate over the query result, which is executed implicitly.
foreach (var item in query)
{
// Modify the address and mark the object as updated.
item.Address += " #101";
context.UpdateObject(item);
// Write out the current values.
Console.WriteLine("Customer ID: {0} \r\nStreet: {1} "
+ "\r\nCity: {2} \r\nState: {3} \r\nZip Code: {4} \r\nCountry: {5}",
item.CustomerID, item.Address, item.City, item.Region,
item.PostalCode, item.Country);
}
// Save changes to the data service.
context.SaveChanges();
}
catch (DataServiceQueryException ex)
{
throw new ApplicationException(
"An error occurred during query execution.", ex);
}
다음 예제에서는 반환된 Customers 엔터티를 새로운 CustomerAddressNonEntity 형식으로 프로젝션하는 LINQ 쿼리를 보여 줍니다. 이 형식에는 주소 관련 속성만 포함되고 ID 속성이 포함되지 않습니다. 이 CustomerAddressNonEntity 클래스는 클라이언트에서 정의되며 엔터티 형식으로 특성이 지정되지 않습니다.
' Create the DataServiceContext using the service URI.
Dim context = New NorthwindEntities(svcUri)
' Define an anonymous LINQ query that projects the Customers type into
' a CustomerAddress type that contains only address properties.
Dim query = From c In context.Customers _
Where c.Country = "Germany" _
Select New CustomerAddressNonEntity With _
{.CompanyName = c.CompanyName, _
.Address = c.Address, _
.City = c.City, _
.Region = c.Region, _
.PostalCode = c.PostalCode, _
.Country = c.Country}
Try
' Enumerate over the query result, which is executed implicitly.
For Each item In query
item.Address += "Street"
Console.WriteLine("Company name: {0} \nStreet: {1} " _
& "\nCity: {2} \nState: {3} \nZip Code: {4} \nCountry: {5}", _
item.CompanyName, item.Address, item.City, item.Region, _
item.PostalCode, item.Country)
Next
Catch ex As DataServiceQueryException
Throw New ApplicationException( _
"An error occurred during query execution.", ex)
End Try
// Create the DataServiceContext using the service URI.
NorthwindEntities context = new NorthwindEntities(svcUri);
// Define an anonymous LINQ query that projects the Customers type into
// a CustomerAddress type that contains only address properties.
var query = from c in context.Customers
where c.Country == "Germany"
select new CustomerAddressNonEntity
{
CompanyName = c.CompanyName,
Address = c.Address,
City = c.City,
Region = c.Region,
PostalCode = c.PostalCode,
Country = c.Country
};
try
{
// Enumerate over the query result, which is executed implicitly.
foreach (var item in query)
{
item.Address += "Street";
Console.WriteLine("Company name: {0} \nStreet: {1} "
+ "\nCity: {2} \nState: {3} \nZip Code: {4} \nCountry: {5}",
item.CompanyName, item.Address, item.City, item.Region,
item.PostalCode, item.Country);
}
}
catch (DataServiceQueryException ex)
{
throw new ApplicationException(
"An error occurred during query execution.", ex);
}
다음 예제에서는 이전 예제에서 사용된 CustomerAddress CustomerAddressNonEntity 형식의 정의를 보여 줍니다.
<DataServiceKey("CustomerID")> _
Partial Public Class CustomerAddress
Private _customerID As String
Private _address As String
Private _city As String
Private _region As String
Private _postalCode As String
Private _country As String
Public Property CustomerID() As String
Get
Return Me._customerID
End Get
Set(ByVal value As String)
Me._customerID = Value
End Set
End Property
Public Property Address() As String
Get
Return Me._address
End Get
Set(ByVal value As String)
Me._address = Value
End Set
End Property
Public Property City() As String
Get
Return Me._city
End Get
Set(ByVal value As String)
Me._city = Value
End Set
End Property
Public Property Region() As String
Get
Return Me._region
End Get
Set(ByVal value As String)
Me._region = Value
End Set
End Property
Public Property PostalCode() As String
Get
Return Me._postalCode
End Get
Set(ByVal value As String)
Me._postalCode = Value
End Set
End Property
Public Property Country() As String
Get
Return Me._country
End Get
Set(ByVal value As String)
Me._country = value
End Set
End Property
End Class
Public Class CustomerAddressNonEntity
Private _companyName As String
Private _address As String
Private _city As String
Private _region As String
Private _postalCode As String
Private _country As String
Public Property CompanyName() As String
Get
Return Me._companyName
End Get
Set(ByVal value As String)
Me._companyName = value
End Set
End Property
Public Property Address() As String
Get
Return Me._address
End Get
Set(ByVal value As String)
Me._address = Value
End Set
End Property
Public Property City() As String
Get
Return Me._city
End Get
Set(ByVal value As String)
Me._city = Value
End Set
End Property
Public Property Region() As String
Get
Return Me._region
End Get
Set(ByVal value As String)
Me._region = Value
End Set
End Property
Public Property PostalCode() As String
Get
Return Me._postalCode
End Get
Set(ByVal value As String)
Me._postalCode = Value
End Set
End Property
Public Property Country() As String
Get
Return Me._country
End Get
Set(ByVal value As String)
Me._country = value
End Set
End Property
End Class
[DataServiceKey("CustomerID")]
public partial class CustomerAddress
{
private string _customerID;
private string _address;
private string _city;
private string _region;
private string _postalCode;
private string _country;
public string CustomerID
{
get
{
return this._customerID;
}
set
{
this._customerID = value;
}
}
public string Address
{
get
{
return this._address;
}
set
{
this._address = value;
}
}
public string City
{
get
{
return this._city;
}
set
{
this._city = value;
}
}
public string Region
{
get
{
return this._region;
}
set
{
this._region = value;
}
}
public string PostalCode
{
get
{
return this._postalCode;
}
set
{
this._postalCode = value;
}
}
public string Country
{
get
{
return this._country;
}
set
{
this._country = value;
}
}
}
public class CustomerAddressNonEntity
{
private string _companyName;
private string _address;
private string _city;
private string _region;
private string _postalCode;
private string _country;
public string CompanyName
{
get
{
return this._companyName;
}
set
{
this._companyName = value;
}
}
public string Address
{
get
{
return this._address;
}
set
{
this._address = value;
}
}
public string City
{
get
{
return this._city;
}
set
{
this._city = value;
}
}
public string Region
{
get
{
return this._region;
}
set
{
this._region = value;
}
}
public string PostalCode
{
get
{
return this._postalCode;
}
set
{
this._postalCode = value;
}
}
public string Country
{
get
{
return this._country;
}
set
{
this._country = value;
}
}
}