从查询中的选择中获取默认值

时间:2016-04-06 07:49:13

标签: linq asp.net-mvc-4

我有点麻烦学习Linq,人们说它不是很难学习谁已经知道一些关于Sql的东西,但我仍然有麻烦,基本上我有一张桌子,我有一个消费或收入,我有麻烦当我在2个日期之间搜索一些值来做统计我知道这发生了,因为有时当我在2个日期之间搜索时我只是有费用而不是收入而在查询中他不知道他应该做什么,所以我怎么能把默认值select?

中所有属性的值
 [HttpPost]
    public ActionResult Index(string dataInicial, string dataFinal)
    {
        var userId = User.Identity.GetUserId();

        var queryDefault = db.SaldoUtilizadores.Where(d => d.ApplicationUserId == userId)
     .GroupBy(x => x.ApplicationUserId)
     .Select(x => new
     {
         biggestValor = x.Max(y => y.valor),
         lowestValor = x.Min(y => y.valor),
         expenses = x.Where(y => y.valor < 0).Sum(y => y.valor),
         earnings = x.Where(y => y.valor > 0).Sum(y => y.valor),
         lowestDate = x.Where(y => y.valor == x.Min(z => z.valor)).Select(y => y.data).FirstOrDefault(),
         biggestDate = x.Where(y => y.valor == x.Max(z => z.valor)).Select(y => y.data).FirstOrDefault()
     }).FirstOrDefault();

我已经搜索了很多,并没有找到一个具体的答案,如果你们可以帮助我,我很感激。

Ps:抱歉我的英文不好

3 个答案:

答案 0 :(得分:1)

Where(condition).Sum(selector)的结果为空集时,而不是Where生成异常,您可以使用以下结构之一:

(A)Where(condition).Select(selector).DefaultIfEmpty().Sum()

expenses = x.Where(y => y.valor < 0).Select(y => y.valor).DefaultIfEmpty().Sum(),
earnings = x.Where(y => y.valor > 0).Select(y => y.valor).DefaultIfEmpty().Sum(),

(B)Where(condition).Select(({nullable type})selector).Sum() ?? 0

expenses = x.Where(y => y.valor < 0).Sum(y => (decimal?)y.valor) ?? 0,
earnings = x.Where(y => y.valor > 0).Sum(y => (decimal?)y.valor) ?? 0,

(C)Sum(condition ? selector : 0)

expenses = x.Sum(y => y.valor < 0 ? y.valor : 0),
earnings = x.Sum(y => y.valor > 0 ? y.valor : 0),

答案 1 :(得分:0)

从您的问题中我发现您正在尝试根据用户ID对值进行分组。

您可以根据需要使用x.DefaultIfEmpty()。

答案 2 :(得分:0)

 expenses = ((x.Where(y => y.valor).Sum(y => y.valor))==null ||(x.Where(y =>y.valor).Sum(y => y.valor))<0)?0:x.Where(y => y.valor).Sum(y => y.valor)