无法按字段分组表

时间:2017-09-19 15:22:10

标签: c# asp.net linq

我列出了_db.Clients中的50个第一个客户以及_db.Fines中每个客户的罚款。 我想将这些客户推送到ClientFineView模型,其TotalEquity总和来自_db.Fines

但我收到了这个错误:

  

演员价值类型' System.Int32'失败,因为具体化值为null。结果类型的通用参数或查询必须使用可空类型。

我猜,我的分组查询不正确,因此无法找到所选的值。 那么我需要做些什么来解决这个问题呢?我将非常感激

LINQ:

IEnumerable<TraderView> clients = await (
                from client in _db.Clients.Take(50)
                join trade in _db.Fines
                    on client.Id equals trade.ClientId
                select new
                {
                    client,
                    trade
                } into clientTrades
                group clientTrades by clientTrades.trade.ClientId into tq
                select new ClientFineView
                {
                    TotalEquity = tq.Sum(x=>x.trade.TotalEquity),
                    Username = tq.FirstOrDefault().client.Username,
                    Email = tq.FirstOrDefault().client.Email,
                    Id = tq.FirstOrDefault().client.Id,
                    Firstname = tq.FirstOrDefault().client.Firstname,
                    Lastname = tq.FirstOrDefault().client.Lastname
                }).ToListAsync();

ClientFineView模型:

public class ClientFineView
    {
        public int Id { get; set; }

        public string Username { get; set; }

        public string Firstname { get; set; }

        public string Lastname { get; set; }

        public string Email { get; set; }

        public DateTime Created { get; set; }

        public decimal TotalEquity { get; set; }
    }

客户端模型

public class Client
        {
            public int Id { get; set; }

            public string Username { get; set; }

            public string Firstname { get; set; }

            public string Lastname { get; set; }

            public string Password { get; set; }

            public string Email { get; set; }

            public DateTime Created { get; set; }

        }

2 个答案:

答案 0 :(得分:0)

我猜这是导致错误

                   parent_
Obs    child_id       id      address                         parent_address

 1         1         501      \partNumber\a$\sometext....\    \partNumber\a$\
 2         2           .      no_parent

如果源为null sum将抛出一个参数null异常 只需添加一个检查,如果count大于0,则获取总和,如果没有将其设置为0

                TotalEquity = tq.Sum(x=>x.trade.TotalEquity)

更新

如果您仍然收到错误,或者您有其他错误 尝试检查tq的计数,因为某些客户端可能有0个罚款,当您尝试使用FirstOrDefault()时将返回null 所以你要在选择之前添加这个检查

                TotalEquity = tq.Select(e => e.trade).Count() > 0 ?  tq.Sum(x=>x.trade.TotalEquity) : 0 

答案 1 :(得分:0)

我遇到了同样的麻烦。在group by查询之前,您应该首先同时选择clienttrade个模型。然后随意使用它们。