Search code examples
c#linqlinq-to-sqlprojection

Linq Projection Question


I'm trying to do the following:

from c in db.GetAllContactsQuery()
select new
{
   ID= c.ID,
   LastName = c.LastName,
   FirstName = c.FirstName,
   Email = c.Email,
   City =c.City+" "+c.State
}

The issue i'm running into is that if c.City or c.State are null, the City property returns null. How can I put a function right beside that City= declaration?

I'd really like to know if its possible to do something like this (this does not work):

from c in db.GetAllContactsQuery()
select new
{
   ID= c.ID,
   LastName = c.LastName,
   FirstName = c.FirstName,
   Email = c.Email,
   City ={ c=>
         //completely sweet function in here
         if(String.IsNullOrEmpty(c.City))
                return "booyah";
   }
}

Solution

  • Use a null coalescing operator? If the value on the left of ?? is null, it is substituted for the value on the right.

    from c in db.GetAllContactsQuery()
    select new
    {
       ID= c.ID,
       LastName = c.LastName,
       FirstName = c.FirstName,
       Email = c.Email,
       City =(c.City??"")+" "+(c.State??"")
    }
    

    In answer to your comment, you need to use AsEnumerable so you can use full CLR goodness:

    db.GetAllContactsQuery()
        .AsEnumerable()
        .Select(c=>new
            {
               ID= c.ID,
               LastName = c.LastName,
               FirstName = c.FirstName,
               Email = c.Email,
               City =MyClrMethod(c.City,c.State)
            })
    

    If db.GetAllContactsQuery() returns many additional fields, select the ones of interest before the AsEnumerable clause to narrow bandwidth requirements.