日期:2014-05-20  浏览次数:20976 次

linq to sql和linq to object还是有不同的……
做的一个同步器,首先要拿最近一天的同步数据:

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)

就报错了,“序列不包含任何元素”……通常这种情况大家是怎么做的呢?

------解决方案--------------------
var testQuery=lstCptrSellStatus.Any()?lstCptrSellStatus.Max(g => g.SynDate):0;

------解决方案--------------------
如果一个序列没有元素,调用Max就出错了。
比如
int[] a = new int[] { };
int max = a.Max(); // 出错
------解决方案--------------------
老曹已经跟你说了原因了啊,你的错误出现在子查询语句上

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

换一下这样来实现:
var lastCptrSellStatus = lstCptrSellStatus.OrderByDescending(p => p.SynDate ).FirstOrDefault();

------解决方案--------------------
引用:
Quote: 引用:

老曹已经跟你说了原因了啊,你的错误出现在子查询语句上

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

换一下这样来实现:
var lastCptrSellStatus = lstCptrSellStatus.OrderByDescending(p => p.SynDate ).FirstOrDefault();


我知道原因啊……可是为何4楼那句不报错呢……4楼的lstCptrSellStatus也是空的


猜测一下,可能是因为linq是延迟执行的,