ViewModel in LINQ

technieken

De door VisualStudio 2013 gegenereerde controller produceert alleen het object zelf, zonder de in het object gerefereerde andere objecten. Om deze toch op te kunnen halen, moet je zelf nog wat meer doen.

Hier een voorbeeld:

Model:

Product Release compositie

De originele methode:

public IQueryable<ProductRelease> GetProductReleases()
{
    return db.ProductReleases;
}

De resulterende JSON:

[{
"Id":1,
"ReleaseDate":"2013-12-03T00:00:00",
"ReleaseName":"A19 v2",
"ReleaseStatus":1,
"ReleaseDescription":null,
"Product":null,
"SoftwareRelease":null,
"HardwareRelease":null
}]

Door een nieuwe klasse ProductReleaseView te creëeren is het mogelijk de gerefereerde objecten wél mee te sturen. De code ziet er dan zo uit:

public IQueryable<ProductReleaseView> GetProductReleases() 
{
    IQueryable<ProductReleaseView> queryResults;
    queryResults = (from pr in db.ProductReleases
                    from prsr in db.ProductReleasesInSystemReleases.Where(prsr => prsr.ProductRelease.Id == pr.Id).DefaultIfEmpty()
                    from prd in db.Products.Where(prd => prd.Id == pr.Product.Id).DefaultIfEmpty()
                    from swr in db.SoftwareReleases.Where(swr => swr.Id == pr.SoftwareRelease.Id).DefaultIfEmpty()
                    from hwr in db.HardwareReleases.Where(hwr => hwr.Id == pr.HardwareRelease.Id).DefaultIfEmpty()
                    select new ProductReleaseView
                    {
                        Id = pr.Id,
                        ReleaseDate = pr.ReleaseDate,
                        ReleaseDescription = pr.ReleaseDescription,
                        ReleaseName = pr.ReleaseName,
                        ReleaseStatus = pr.ReleaseStatus,

                        Product = prd,
                        SoftwareRelease = swr,
                        HardwareRelease = hwr
                    });
    return queryResults;
}

Het eerste deel van de query voert een inner join uit om de benodigde gerefereerde objecten op te halen.

Het tweede deel met de select, creëert een nieuw ProductReleaseView object met daarin de benodigde properties. In de laatste regels van dit deel worden de drie gerefereerde objecten aan het nieuwe object toegevoegd.

De resulterende JSON:

[{
  "Id":1,"ReleaseDate":"2013-12-03T00:00:00",
  "ReleaseName":"A19 v2",
  "ReleaseStatus":1,
  "ReleaseDescription":null,
  "Product":{
    "Id":1,
    "ProductClass":2,
    "Name":"A19",
    "ModelId":"LCT001",
    "ProductionStartDate":"2012-10-01T00:00:00",
    "ProductionEndDate":"0001-01-01T00:00:00"
  },
  "SoftwareRelease":{
    "Version":"v1.23",
    "ReleaseNotesUrl":null,
    "Id":1,
    "ReleaseDate":"2013-12-03T00:00:00",
    "ReleaseName":"A19 v2",
    "ReleaseStatus":1,
    "ReleaseDescription":null
  },
  "HardwareRelease":{
    "Id":1,
    "ReleaseDate":"2013-12-03T00:00:00",
    "ReleaseName":"Bulb A19 v2",
    "ReleaseStatus":1,
    "ReleaseDescription":null
  }
}]

vrijdag 13 maart 2015