In a Linq Statement like the following (narrowed down to relevant parts for the question):
var sites = from s in DataContext.Sites
join add in DataContext.Address
on s.PrimaryAddress equals add into sa
from a in sa.DefaultIfEmpty()
select new {
s.Id,
s.SiteName,
PrimaryAddress = a
};
The problem we have is that a control ultimately based on a GridView/LinqDataSource combination cannot sort correctly on the PrimaryAddress joined class (ignores it). We see this same behavior for all joined classes like this. Is there any way for GridView to handle this? Or alternatively, is there a way via Expressions that we can handle it in code in a dynamic OrderBy?
Additional notes: When adding .OrderBy(s => s.PrimaryAddress)
we get Cannot order by type 'Address'
, when doing .OrderBy(gs => gs.PrimaryBusinessAddress.AddressLine1)
we get Specified method is not supported.
When doing the sort on the LinqDataSource.OrderBy itself, it's too late...it only sorts the records on the current page and not the overall set.
For clarity, this is the format of the Address in the grid:
public partial class Address
{
public override string ToString()
{
return string.Format("{0} {1}{2} {3}",
AddressLine1,
City,
!string.IsNullOrEmpty(State) && State != "None" ? ", " + State : string.Empty,
!string.IsNullOrEmpty(Country) ? string.Format("({0})", Country) : string.Empty);
}
}
If we could sort by AddressLine1 + City + State + Country
, that would be good enough, but I'm unsure of how to do this via an expression tree...no matter what OrderBy we specify via expressions, it reverts to sorting by s.SiteName (the default sort on the grid). There are a very limited number of joined classes like this that show in our grid control, having an switch and Expression case for each would not be a problem at all. Any thoughts on a solution, or completely different approach?