LINQ generating SQL not supported by SQL Server 2008R2 -
i using ef 6.1.3 in asp.net mvc 5 project. although development environment sql server 2012, qa , production on sql server 2008 r2.
i have report show top 5 procedure codes utilized physician, have simple entity id, name, code1, code2,... code5.
there fair amount of logic in building linq query, list of physician , list of codes , join them. here code joins them , picks top 5 codes:
var report = pr in providerrisklevels join nc in newcodes on pr.provider.providerid equals nc.providerid pr.riskcategoryid == riskscoreids.visiblerisk && (filterrisklevelnums.contains(pr.risklevelnum)) && (filterspecialtyid == 0 || pr.provider.specialty.specialtyid == filterspecialtyid) select new reportnewcodesentity { providerid = pr.provider.providerid, providername = pr.provider.name, providercode = pr.provider.providercode, specialtyname = pr.provider.specialty.name, specialtycode = pr.provider.specialty.specialtycode, riskscore = pr.riskscore, risklevelname = pr.risklevelname, risklevelnum = pr.risklevelnum, newcode1 = nc.codes.orderbydescending(c => c.volume).firstordefault().procedurecode, newcode2 = nc.codes.orderbydescending(c => c.volume).skip(1).firstordefault().procedurecode, newcode3 = nc.codes.orderbydescending(c => c.volume).skip(2).firstordefault().procedurecode, newcode4 = nc.codes.orderbydescending(c => c.volume).skip(3).firstordefault().procedurecode, newcode5 = nc.codes.orderbydescending(c => c.volume).skip(4).firstordefault().procedurecode }; return report;
the problem 4 skip().firstordefault()
generate sql syntax not available on sql server 2008 r2:
offset x rows fetch next 1 rows
where x = 1 4
i'm sure can move stored procedure (much better @ t-sql linq), since have been trying grip on linq, wondering if there either:
- a directive tell linq version of target database generate compliant code
- another method extract these top 5 codes.
i have codes ordered correctly in newcodes (see below) unable pick them without skip (which required it's own sort clause).
var newcodes = cc in codecounts group cc new {cc.providerid} g select new providernewcodesentity { providerid = g.key.providerid, codes = g.orderbydescending (x => x.volume).take(5).tolist() };
best, scott
in order linq generate compatible code, edited generated edmx file (don't shriek yet , keep reading).
we found (on line 7)
<schema namespace="complianceriskmodel.store" providermanifesttoken="2012" provider="system.data.sqlclient" ...>
and changed
<schema namespace="complianceriskmodel.store" providermanifesttoken="2008" provider="system.data.sqlclient" ...>
to prevent losing setting every time refresh model database, adding build task automatically update edmx file in beforebuild target, described @ http://www.programmingmotility.com/2011/05/setting-providermanifesttoken-for-sql.html
best, scott
Comments
Post a Comment