Compartir a través de


Cómo: Proyectar los resultados de una consulta (WCF Data Services)

La proyección proporciona un mecanismo para reducir la cantidad de datos devueltos por una consulta mediante la especificación de que solo se devuelven algunas propiedades de una entidad en la respuesta. Puede realizar proyecciones en los resultados de una consulta de WCF Data Services mediante la opción de consulta $select o mediante la cláusula select (Select en Visual Basic) en una consulta LINQ. Para obtener más información, vea Consultar el servicio de datos (WCF Data Services).

En el ejemplo de este tema se usa el servicio de datos de ejemplo Northwind y las clases del servicio de datos del cliente generadas automáticamente. Se crean este servicio y las clases de datos del cliente al completar el tutorial rápido del servicio de datos de WCF.

Ejemplo

En el siguiente ejemplo se muestra una consulta LINQ que proyecta entidades Customers en un nuevo tipo CustomerAddress, que contiene solo las propiedades específicas de la dirección más la propiedad de identidad. Esta clase CustomerAddress se define en el cliente y recibe el atributo para que la biblioteca de cliente pueda reconocerla como tipo de entidad.

' 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);
}

En el siguiente ejemplo se muestra una consulta LINQ que proyecta las entidades Customers devueltas en un nuevo tipo CustomerAddressNonEntity, que contiene solo las propiedades específicas de la dirección y no tiene propiedad de identidad. Esta clase CustomerAddressNonEntity se define en el cliente y no recibe el atributo como tipo de entidad.

' 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);
}

En el siguiente ejemplo se muestran las definiciones de los tipos CustomerAddress CustomerAddressNonEntity usados en los ejemplos anteriores.

<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;
        }
    }
}