如何用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表达式获取所有记录,如何该,此处共有几种语法可以实现?
谢谢!
一切,都在意料之中!- 已移动 Sheng Jiang 蒋晟MVP, Moderator 2009年10月6日 0:43 数据库开发 (发件人:ASP.NET 与 AJAX)
全部回复
-
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:34IEnumerable<Order> order = db.Orders;
-
2009年10月6日 4:01
已经试过了,大家提供的方法都不行不通。我要的就是要更改我说的那两个地方,可是大家说的改了,因为我学习的整本书中,都是这种程序,请理解,不然我真糊涂了。
因为书中的例子可是运行,只不过取得的是第一条记录,但是我想取得所在记录。
一切,都在意料之中! -
2009年10月6日 4:27IEnumerable<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:14IEnumerable<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();//更新操作
如果您觉得对您有帮助,请在“是否有帮助”点“是”;如果你觉得回复很满意,请“标记为已解答”- 已标记为答案 Allen Chen - MSFTModerator 2009年10月12日 2:29
-
2009年10月25日 12:00好久,没有来了,谢谢大家。正在学习这些呢。
一切,都在意料之中! -
2009年11月18日 8:34public 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怎么获取具体字段的值?

