Mike
Mike

Reputation: 715

LinqToSql: How can I create a projection to adhere to DRY?

Just wondering if there is a way to take some of the repitition out of a LINQ to SQL projected type.

Example:

Table: Address

Fields: AddressID, HouseNumber, Street, City, State, Zip, +20 more

Class MyAddress: AddressID, HouseNumber, Street (Only 3 fields)

LINQ:

from a in db.Addresses
select new MyAddress
{
  AddressID = a.AddressID,
  HouseNumber = a.HouseNumber,
  Street = a.Street
}

The above query works perfectly, and I understand why something like this will return all 20+ fields in each row:

from a in db.Addresses
select new MyAddress(a);

class MyAddress
{
  public MyAddress(Address a)
  {
    this.AddressID = a.AddressID,
    this.HouseNumber = a.HouseNumber,
    this.Street = a.Street
  }
}

Which leads me to my Question:

Is it possible to implement some kind of helper function or extension method to "map" from the LINQ model to MyAddress yet only return the necessary fields in the query result rather than all of the fields?

Upvotes: 1

Views: 203

Answers (1)

Peter Willis
Peter Willis

Reputation: 956

from a in db.Addresses
select new MyAddress
{
  AddressID = a.AddressID,
  HouseNumber = a.HouseNumber,
  Street = a.Street
}

That query will only select the requested fields in the resulting SQL.

A function to re-use the type will look like:

public IQueryable<MyAddress> ProjectAddress(IQueryable<Address> addresses)
{
    return from a in addresses
           select new MyAddress
           {
               AddressID = a.AddressID,
               HouseNumber = a.HouseNumber,
               Street = a.Street
           };
}

This can be used like this:

return ProjectAddress(db.Addresses);

I think a function would look something like:

public static Expression<Func<Address, MyAddress>> ToMyAddress()
{
    return a => new MyAddress { AddressID = a.AddressID, 
                                HouseNumber = a.HouseNumber,
                                Street = a.Street
                              };
}

Upvotes: 2

Related Questions