i've been testing performance , code readability function delivers list of ef entity items ajax call (json).
here's code 4 alternatives (itemlist1, itemlist2, itemlist3, , itemlist4) deliver list of usernotification entity json:
public actionresult getlatestnotificationitems(int nstart, int nfinish) { int ncurrentuserid = user.identity.getuserid<int>(); var itemlist1 = (from un in db.usernotifications un.userid == ncurrentuserid orderby un.datecreated descending, un.id ascending select new { datecreated = un.datecreated, hasbeenseen = un.hasbeenseen, id = un.id, message = un.message, title = un.title, userid = un.userid, actionurl = un.actionurl }) .skip(nstart) .take(nfinish - nstart + 1).tolist(); var itemlist2 = db.usernotifications.where(u => u.userid == ncurrentuserid) .orderbydescending(u => u.datecreated) .thenby(u => u.id) .skip(nstart) .take(nfinish - nstart + 1) .select(s => new { datecreated = s.datecreated, hasbeenseen = s.hasbeenseen, id = s.id, message = s.message, title = s.title, userid = s.userid, actionurl = s.actionurl }).tolist(); *//querygetlatestnotificationitemsreturntype class return types.* var itemlist3 = db.database.sqlquery<querygetlatestnotificationitemsreturntype>("select id, datecreated, hasbeenseen, message, title, userid, actionurl usernotifications userid = " + "{0} order datecreated desc, id asc offset {1} rows fetch next {2} rows only", ncurrentuserid, nstart, (nfinish - nstart + 1)) .tolist(); //disable proxycreation "itemlist4" option. (to strip entities poco objects without unnecessary ef data) db.configuration.proxycreationenabled = false; var itemlist4 = db.usernotifications.sqlquery( "select id, datecreated, hasbeenseen, message, title, userid, actionurl usernotifications userid = " + "{0} order datecreated desc, id asc offset {1} rows fetch next {2} rows only", ncurrentuserid, nstart, (nfinish - nstart + 1)) .tolist(); db.configuration.proxycreationenabled = true; return json(itemlist4, jsonrequestbehavior.allowget); }
these times when executed (3 passes each):
- itemlist1: 28ms, 21ms, 16ms
- itemlist2: 22ms, 19ms, 18ms
- itemlist3: 15ms, 4ms, 5ms
- itemlist4: 18ms, 5ms, 7ms
now, question is, 1 recommended 1 use? because:
itemlist3 quickest execute, requires poco structure creation apart ef model, , raw sql instead of linq.
itemlist4 quick, requires playing around context's proxycreationenabled , raw sql instead of linq.
and both itemlist1 , itemlist2 perform poorly use nice compilable, easier read linq.
you sound you're looking @ options... consider queryfirst?
in terms of criteria, performance, db access vanilla ado. there isn't faster way. also, don't need create pocos, they're generated @ design time queryfirst, based on schema returned query.
you compiled linq instead of "raw sql". reacting sql in string literals? should! it's mystery weird cultural practice continues. queryfirst lets put sql in own file. it's not compiled il, it's validated editor type (with intellisense), test run queryfirst when save file, , elevated status of language. pass list<queryresults>
(returned generated execute()
method) serializer , outta there. bear in mind since db speaks sql, other option generating sql behind scenes. why not take control?
Comments
Post a Comment