Partager via


Procédure : projeter des résultats de requête (WCF Data Services)

La projection fournit un mécanisme permettant de réduire la quantité de données retournées par une requête en spécifiant que seules certaines propriétés d'une entité doivent être retournées dans la réponse. Vous pouvez effectuer des projections sur les résultats d'une requête Services de données WCF en utilisant l'option de requête $select ou en utilisant la clause select (Select dans Visual Basic) dans une requête LINQ. Pour plus d'informations, voir Interrogation du service de données (WCF Data Services).

L'exemple dans cette rubrique utilise l'exemple de service de données Northwind et des classes de service de données client générées automatiquement. Ce service et les classes de données clientes sont créés lorsque vous complétez le démarrage rapide WCF Data Services.

Exemple

L'exemple suivant affiche une requête LINQ qui projette des entités Customers dans un nouveau type CustomerAddress, qui contient uniquement des propriétés spécifiques à l'adresse ainsi que la propriété d'identité. Cette classe CustomerAddress est définie sur le client et est attribuée de sorte que la bibliothèque cliente puisse le reconnaître comme un type d'entité.

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

L'exemple suivant affiche une requête LINQ qui projette les entités Customers retournées dans un nouveau type CustomerAddressNonEntity, qui contient uniquement des propriétés spécifiques à l'adresse et aucune propriété d'identité. Cette classe CustomerAddressNonEntity est définie sur le client et n'est pas attribuée comme un type d'entité.

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

L'exemple suivant affiche les définitions des types CustomerAddressCustomerAddressNonEntity utilisés dans les exemples précédents.

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