我们写一个Linq查询的时候一般是这样的,直接写在前台的DataContext db = new DataContext();var query = from d in db.Article
            select new {ID=d.Id};
这里我只要查询一个id字段,上面代码生成的sql语句为:select id from Article
现在吧select 后面的部分写成一个变量,怎么写???返回类型是什么
方法成参数化public IEnumerable<T> GetList<T>(Func<Article,T> selector)
{
DataContext db = new DataContext();var query = from d in db.Article
            select selector(d);
return query ;
}
这样虽然可以调用,也没有什么问题,但是生成的sql确是:select * from Article全部字段都查询出来,
后面试了下,只要select为变量的话,都是select全部字段的,有没有办法让select部分参数化,却查询的字段也不是全部的

解决方案 »

  1.   

    解决方案很多
    1. 你可以利用LINQ的延迟查询特性,在查询的基础上再查询  返回自己想要的结果
        public IEnumerable<T> GetList<T>(Func<Article,T> selector)
    {
    DataContext db = new DataContext();var query = from d in db.Article
                select selector(d);
    return query ;
    }
    var query=...;
    var result= from r  in query
                select r.ID;   
    2.动态创建表达式树
    http://www.cnblogs.com/snowdream/archive/2008/07/18/1246308.html
      

  2.   

    ORM的意义在于此,你取出的应该是一个完整的对象,而不是数据残片
      

  3.   

    我就是这样谢的,但是不管外面查询几个字段,生成的sql都是select全部字段的,
    除非select 后面写死他
      

  4.   

    var query = from d in db.Article
                select d.Id;
    return query ;
      

  5.   

    这个问题后面解决了,就是返回类型问题
    IEnumerable<T> 这个是枚举对象,也就是说,返回后他已经生成了sql只是还没有去查询而已
    应该返回IQueryable<T>,这个跟上面的有什么区别呢,query返回的是一个表达式树,只有你调用foreach或者ToList等方法时才会生成sql并查询,只有就可以达到我要去的效果,上面的方法已经测试了,确实是可以的