如何用lamba表达式获取所有记录?

Answered 如何用lamba表达式获取所有记录?

  • 2009年10月5日 20:27
     
     

    请问我在学习中遇到这样一个例题:
     /// <summary>
        /// 通过订单号获取数据库中的订单
        /// </summary>
        /// <param name="orderId">订单ID</param>
        /// <returns>一个订单实体信息</returns>
        public Order GetOrder(int orderId)
        {
            //创建数据上下文
            DataClassesDataContext db = new DataClassesDataContext();
            //根据订单ID获取订单
            Order order = db.Orders.First(o => o.OrderID == orderId);
            //返回订单
            return order;
        }

    在这个例题中,如果我不想如例那样根据id查询第一第记录,而是想获取所有记录,该如何写:
    我写成这样是不通过的:

        public Order GetOrder( )
        {
           
            DataClassesDataContext db = new DataClassesDataContext();
        
            Order order = db.Orders.all();
       
            return order;
        }
    结果报错,说all参数o什么的错误。
    请问这句改成用lamba表达式获取所有记录,如何该,此处共有几种语法可以实现
    谢谢!


    一切,都在意料之中!

全部回复

  • 2009年10月6日 1:10
     
     

    你想取得的是Order collection,所以你返回类型不能是Order.
    可以这样:
     public IEnumerable<Order> GetOrder( )
        {
           
            DataClassesDataContext db = new DataClassesDataContext();
        
            return db.Orders;
        }

    如果你关心语法,那就太多了,比如
    db.Orders.Select(o => o)
    或者
    db.Orders.Where(o => true)
    或者
    db.Orders.ToList();
    ...

  • 2009年10月6日 2:14
     
     
    谢谢你的回复,我试试去,呆会儿回来。
    一切,都在意料之中!
  • 2009年10月6日 3:34
     
     
    IEnumerable<Order> order = db.Orders;
  • 2009年10月6日 4:01
     
     

    已经试过了,大家提供的方法都不行不通。我要的就是要更改我说的那两个地方,可是大家说的改了,因为我学习的整本书中,都是这种程序,请理解,不然我真糊涂了。
    因为书中的例子可是运行,只不过取得的是第一条记录,但是我想取得所在记录。


    一切,都在意料之中!
  • 2009年10月6日 4:27
     
     
    IEnumerable<Order> order = from o in db.Orders
                                                select o;试试

  • 2009年10月6日 5:19
     
     
    还是不行的,是不是这种写法,根本不能查询全部的记录呢。
    public Order GetOrder( )
        {
           
            DataClassesDataContext db = new DataClassesDataContext();
        
            Order order = db.Orders.all();
       
            return order;
        }

    一切,都在意料之中!
  • 2009年10月6日 5:21
     
     

    public IQueryable<Order>GetOrder( )
        {
           
            DataClassesDataContext db = new DataClassesDataContext();
        
    IQueryable<Order> order = from o in db.Orders
                                                select o;试试
       
            return order;
        }
  • 2009年10月6日 6:44
     
     
    还是不行的,是不是这种写法,根本不能查询全部的记录呢。
    public Order GetOrder( )
        {
           
            DataClassesDataContext db = new DataClassesDataContext();
        
            Order order = db.Orders.all();
       
            return order;
        }

    一切,都在意料之中!

    您好,您一直想获得所有的记录,可是您给出的方法的返回值一直是单个Order,请将方法定义:
    public Order GetOrder( ) 改为 public IEnumerable<Order> GetOrder( ) 或IQueryable<Order> GetOrder( ) 或 public System.Data.Linq.Table<Order> GetOrder( )

    另db.Orders已经是返回所有的订单记录了。无需使用All方法,且All方法是个带参数的委托,您没有指定参数,所以提示“没有采用0个参数的重载”。一定要用的话,请参考:
     db.Orders.All(o => o.EmployeID == "111"); //在这里假设Order有个员工ID的属性。意思是返回员工号为111的订单集合。
  • 2009年10月6日 7:14
     
     
    IEnumerable<Order> GetOrder( ) 合适数组 的 用在sql的话异常!
    IQueryable<Order> GetOrder( ) 合适linq in sql 的
  • 2009年10月6日 12:45
     
     
    仍旧通不过,不过不是谢谢大家。
    一切,都在意料之中!
  • 2009年10月6日 13:28
    版主
     
     
    返回值肯定得改~理由上面已经说清楚了~
    如果一定要用Lambda表达式~只要满足db.Orders.Select(参数=>始终为真的条件)~就可以获取到所有记录~
  • 2009年10月6日 13:51
     
     
    返回值肯定得改~理由上面已经说清楚了~
    如果一定要用Lambda表达式~只要满足db.Orders.Select(参数=>始终为真的条件)~就可以获取到所有记录~

    你好,不太明白,上面的回复,全部试过了,始终总是有一个错误存在。返回值改了也不行的。
    一切,都在意料之中!
  • 2009年10月6日 14:04
    版主
     
     
    你好~提示的是什么错误?有详细的信息吗?
  • 2009年10月6日 15:34
     
     
    仍旧通不过,不过不是谢谢大家。
    一切,都在意料之中!

    您好,语法上按我所给出的应该是没问题的。可以把错误信息贴出来。或把完整代码贴出,并标明错误的提示。让大家一起来看看。
  • 2009年10月7日 9:50
     
     

    大家好,这样写的程序是不会有错的:
    public Message GetAllMessage()
        {
            //初始化返回的变量
            Message allMessage = null;

           //创建数据连结上下文
            DataClasses01DataContext db = new DataClasses01DataContext();
            //获取第一条会员信息
            try
            {
                allMessage = db.Message.FirstOrDefault();

            }
            catch (System.InvalidOperationException)
            {

                allMessage = null;
            }
            //返回会员信息实体

            return allMessage;
        }

    但是    try
            {
                allMessage = db.Message.FirstOrDefault();

            }
    中的allMessage = db.Message.FirstOrDefault();不能更改为获取所有的记录,无论改成上面各位说的那样,换成如allMessage = db.Message.Select(o => o);都有错误,说这一名有隐式转换错误,换成上面大家说的public Message GetAllMessage()为public IQueryable<Message> GetAllMessage()最下面的return allMessage马上报allMessage说什么显示隐式转换错误,请大家试一下。


    一切,都在意料之中!
  • 2009年10月7日 10:16
     
     

    大家好,这样写的程序是不会有错的:
    public Message GetAllMessage()
        {
            //初始化返回的变量
            Message allMessage = null;

           //创建数据连结上下文
            DataClasses01DataContext db = new DataClasses01DataContext();
            //获取第一条会员信息
            try
            {
                allMessage = db.Message.FirstOrDefault();

            }
            catch (System.InvalidOperationException)
            {

                allMessage = null;
            }
            //返回会员信息实体

            return allMessage;
        }

    但是    try
            {
                allMessage = db.Message.FirstOrDefault();

            }
    中的allMessage = db.Message.FirstOrDefault();不能更改为获取所有的记录,无论改成上面各位说的那样,换成如allMessage = db.Message.Select(o => o);都有错误,说这一名有隐式转换错误,换成上面大家说的public Message GetAllMessage()为public IQueryable<Message> GetAllMessage()最下面的return allMessage马上报allMessage说什么显示隐式转换错误,请大家试一下。


    一切,都在意料之中!

    您好,当然会报这个错,原先的代码是返回一条记录,是一个Message对象,而您的要求是返回所有记录,这是一个集合当然是IQueryable<Message>这种形式,IQueryable<Message>与Message不是同一类东西。所以报错。上面我已一再强申明这两个区别。

    按照您的要求,原先的代码就需要修改,不能这么简单的 allMessage = GetAllMessage(),这本就是两个东西。其它代码也要改。
    想清楚为什么要求返回所有的记录?然后返回后怎么使用,不能把一个集合当成一条记录来使用。通常对集合要用for或foreach来遍历使用。
  • 2009年10月7日 10:21
     
     
    谢谢你的回复,可是我还是不明白,目前我只是对着一本书在学习,想要修改一下,结果修改就报错,所以还请直接修改这个示例好吗?
    一切,都在意料之中!
  • 2009年10月7日 10:38
     
     
    你买的什么书 可以说一下吗?
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
  • 2009年10月7日 11:41
     
     
    你买的什么书 可以说一下吗?
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”

    精通ASP[1].NET+3.5企业级开发
    一切,都在意料之中!
  • 2009年10月7日 13:11
     
     
    你买的什么书 可以说一下吗?
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”

    精通ASP[1].NET+3.5企业级开发
    一切,都在意料之中!

    那书里面linq都是简介的 随便写的 不要太当真了 你真想学linq的话我建议你 专门买一本linq书 学习 我正在学
    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
  • 2009年10月7日 15:22
    版主
     
     
    你遇到的这个错误不是Lambda表达式的错误~而是类型不匹配的问题~原来只返回一条记录~现在返回的是多条记录~一个集合~他们的类型是不一样的~所以原来处理一条记录的代码要改成能处理多条记录(一个集合)的代码~
  • 2009年10月8日 3:06
     
     

    谢谢各位的解答,终于明白查询一条记录和所有记录是不一样的,在各位的提示下,我查阅了相关资料,得出以下几种方法都可以,可是问题又出来了,就是第二种,在用listview显示时,提示什么排序错误,好象是第二种不能支持排序。还有就是这几种和先前的写法太不同了,不需要首先给allMessage赋初值,而且也不用try cath。区别太了,为什么?
    1、public IList<Message> GetAllMessage()
        {
            //初始化返回的变量
            //Message allMessage = null;

            //创建数据连结上下文
            DataClasses01DataContext db = new DataClasses01DataContext();
            
               var allMessage = from q in db.Message select q;
                  
            return allMessage.ToList<Message>();
           
        }

     

    2、  

     public IQueryable<Message> GetAllMessage()
        {
            //初始化返回的变量
            //Message allMessage = null;

            //创建数据连结上下文
            DataClasses01DataContext db = new DataClasses01DataContext();
                   
               var allMessage = from q in db.Message select q;  
           
            return allMessage;
           
        }

    3\

     public List<Message> GetAllMessage()
        {
           
            //创建数据连结上下文
            DataClasses01DataContext db = new DataClasses01DataContext();
          
            List<Message> allMessage = (from q in db.Message select q).ToList();
            if (allMessage.Count() > 0)
            {
            return allMessage;
            }
            else
            {
                return null;
            }
        }


    一切,都在意料之中!
  • 2009年10月8日 4:24
     
     

    第二种是推迟查询 优势是能直接修改 删除 添加数据

    用控件排列 当然出错的

    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
  • 2009年10月8日 10:12
     
     

    第二种是推迟查询 优势是能直接修改 删除 添加数据

    用控件排列 当然出错的

    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”

    可否示例啊。
    一切,都在意料之中!
  • 2009年10月8日 10:54
     
     已答复

    第二种是推迟查询 优势是能直接修改 删除 添加数据

    用控件排列 当然出错的

    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”

    可否示例啊。
    一切,都在意料之中!


       DataContext db = new DataContext("链接字符串");

                IQueryable<Message> allMessage = from q in db.Message select q;
                Message mes = allMessage.Where(e => e.id ==1).First();
                db.Message.DeleteOnSubmit(mes);//删除操作

                Message mesinset = new Message();
                mesinset.id = 1;
                mesinset.name = "ss";
                db.Message.DeleteOnSubmit(mesinset);//插入操作

              Message  um = (from q in db.Message where q.id==1 select q).First<Message>();
              um.name = "dd";
              db.SubmitChanges();//更新操作


    如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”
  • 2009年10月25日 12:00
     
     
    好久,没有来了,谢谢大家。正在学习这些呢。
    一切,都在意料之中!
  • 2009年11月18日 8:34
     
     
     public Order GetOrder( )
        {
           
            DataClassesDataContext db = new DataClassesDataContext();
        
            var order = db.Orders.Where(o => o.OrderID == orderId).toList<Orders>(); 
       
            return order;
        }

    LZ的意思是这样?
  • 2012年4月16日 11:53
     
     
    怎么获取具体字段的值?