c# 3.0 - linq help - newbie -
how come work
public iqueryable<category> getcategories(int postid) { subnusmvcrepository<categories> categories = new subnusmvcrepository<categories>(); subnusmvcrepository<post_category_map> postcategorymap = new subnusmvcrepository<post_category_map>(); var query = c in categories.getall() join pcm in postcategorymap.getall() on c.categoryid equals pcm.categoryid pcm.postid == 1 select new category { name = c.name, categoryid = c.categoryid }; return query; }
but not
public iqueryable<category> getcategories(int postid) { subnusmvcrepository<categories> categories = new subnusmvcrepository<categories>(); subnusmvcrepository<post_category_map> postcategorymap = new subnusmvcrepository<post_category_map>(); var query = c in categories.getall() join pcm in postcategorymap.getall() on c.categoryid equals pcm.categoryid pcm.postid == postid select new category { name = c.name, categoryid = c.categoryid }; return query; }
the issue in implementation of query provider.
pcm.postid == 1
and
pcm.postid == postid
actually have big difference. in expression tree first generated constantexpression doesnt need evaulated.
with second, compiler generates inner class here (this _displayclassx see). class have property (will same name parameter) , expression tree create memberaccessexpression points auto-generated displayclassx. when query provider comes accross need compile() lambda expression , evaluate delegate value use in query.
hope helps.
cosullivan
Comments
Post a Comment