linq to sql和linq to object还是有不同的……

romanchaos 2014-01-18 01:04:14
做的一个同步器,首先要拿最近一天的同步数据:

var lstCptrSellStatus = (from p in db.CptrSellingStatus where p.ItemId == CptrItemId select p).ToList();
var lastCptrSellStatus = lstCptrSellStatus.Where(p => p.SynDate == lstCptrSellStatus.Max(g => g.SynDate)).FirstOrDefault();

其中lstCptrSellStatus可能没数据,但lstCptrSellStatus.Max这里可以正常运行。然后如果同步数据最近一天时间比现在超过1天的插入数据,否则更新,所以要重新拿另一条同步记录:

lastCptrSellStatus = lstCptrSellStatus.Where
(
p => p.SynDate == lstCptrSellStatus.Where(g => g.SynDate < lastCptrSellStatus.SynDate).ToList().Max(g => g.SynDate)
).FirstOrDefault();

到了这里

lstCptrSellStatus.Where(g => g.SynDate < lastCptrSellStatus.SynDate).ToList().Max(g => g.SynDate)

就报错了,“序列不包含任何元素”……通常这种情况大家是怎么做的呢?
...全文
358 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 6 楼 romanchaos 的回复:
[quote=引用 5 楼 q107770540 的回复:] 老曹已经跟你说了原因了啊,你的错误出现在子查询语句上 var lastCptrSellStatus = lstCptrSellStatus.Where(p => p.SynDate == lstCptrSellStatus.Max(g => g.SynDate)).FirstOrDefault(); 换一下这样来实现:
var lastCptrSellStatus = lstCptrSellStatus.OrderByDescending(p => p.SynDate ).FirstOrDefault();
我知道原因啊……可是为何4楼那句不报错呢……4楼的lstCptrSellStatus也是空的[/quote] 猜测一下,可能是因为linq是延迟执行的,
romanchaos 2014-01-20
  • 打赏
  • 举报
回复
引用 5 楼 q107770540 的回复:
老曹已经跟你说了原因了啊,你的错误出现在子查询语句上 var lastCptrSellStatus = lstCptrSellStatus.Where(p => p.SynDate == lstCptrSellStatus.Max(g => g.SynDate)).FirstOrDefault(); 换一下这样来实现:
var lastCptrSellStatus = lstCptrSellStatus.OrderByDescending(p => p.SynDate ).FirstOrDefault();
我知道原因啊……可是为何4楼那句不报错呢……4楼的lstCptrSellStatus也是空的
q107770540 2014-01-20
  • 打赏
  • 举报
回复
老曹已经跟你说了原因了啊,你的错误出现在子查询语句上 var lastCptrSellStatus = lstCptrSellStatus.Where(p => p.SynDate == lstCptrSellStatus.Max(g => g.SynDate)).FirstOrDefault(); 换一下这样来实现:
var lastCptrSellStatus = lstCptrSellStatus.OrderByDescending(p => p.SynDate ).FirstOrDefault();
romanchaos 2014-01-20
  • 打赏
  • 举报
回复
引用 3 楼 caozhy 的回复:
如果一个序列没有元素,调用Max就出错了。 比如 int[] a = new int[] { }; int max = a.Max(); // 出错
其实问题就在此,lstCptrSellStatus是没有元素的,那么为何

var lastCptrSellStatus = lstCptrSellStatus.Where(p => p.SynDate == lstCptrSellStatus.Max(g => g.SynDate)).FirstOrDefault();
这一句没有报错呢?
threenewbee 2014-01-18
  • 打赏
  • 举报
回复
如果一个序列没有元素,调用Max就出错了。 比如 int[] a = new int[] { }; int max = a.Max(); // 出错
q107770540 2014-01-18
  • 打赏
  • 举报
回复
var testQuery=lstCptrSellStatus.Any()?lstCptrSellStatus.Max(g => g.SynDate):0;
romanchaos 2014-01-18
  • 打赏
  • 举报
回复
刚才试了下:

var testQuery=lstCptrSellStatus.Max(g => g.SynDate);
将这句独立出来也会报错,但放里面就没问题……

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧