繁体   English   中英

强制转换为值类型System.Boolean,因为物化值为null,结果类型的泛型参数必须使用可为空的类型

[英]The cast to value type System.Boolean failed because the materialized value is null, result type's generic parameter must use a nullable type

这段代码之前是有效的,但现在我出现了此错误:转换为值类型'System.Boolean'失败,因为实例化值为null。 结果类型的通用参数或查询必须使用可为空的类型。

public async Task<ActionResult> BankDepositVoucher(BankDepositVoucherSearchViewModel search, int? PageNo)
        {
            var model = new BankDepositVoucherListViewModel
            {
                Search = search ?? new BankDepositVoucherSearchViewModel()
            };
            if (search != null)
            {
                search.StartDate = search.StartDate.ToStartOfDay();
                search.EndDate = search.EndDate.ToEndOfDay();
            }
            try
            {
                var Vouchers = DbManager.Invoices.Include(x => x.BankDepositVoucher)
                                             .Where(x => x.Type == InvoiceType.BankDepositVoucher
                                             && (x.VoucherNumber == search.VoucherNo || search.VoucherNo == null)
                                             && (x.BankDepositVoucher.SlipNo.Contains(search.SlipNo) || search.SlipNo == null)
                                             && (x.BankDepositVoucher.ChequeNo.Contains(search.ChequeNo) || search.ChequeNo == null)
                                             && (x.BankDepositVoucher.Bank.AccountName.Contains(search.BankDetails)
                                             || search.BankDetails == null)
                                             && (x.BankDepositVoucher.AccountName.Contains(search.AccountName) || search.AccountName == null)
                                             && (x.BankDepositVoucher.Narration.Contains(search.Narration) || search.Narration == null)
                                             && (x.TotalAmount == search.Amount || search.Amount == null)
                                             && (x.Date >= search.StartDate || search.StartDate == null)
                                              && (x.Date <= search.EndDate || search.EndDate == null));
                //model.Pager = new Pager(await Vouchers.CountAsync(), PageNo, 10);
                model.Vouchers = await Vouchers.OrderByDescending(x => x.VoucherNumber)
                                    //.Skip((model.Pager.CurrentPage - 1) * model.Pager.PageSize)
                                    //.Take(model.Pager.PageSize)
                                    .Select(x => new BankDepositVoucherBaseViewModel
                                    {
                                        Id = x.Id,
                                        VoucherNumber = x.VoucherNumber,
                                        AccountName = x.BankDepositVoucher.AccountName,
                                        BankAccountName = x.BankDepositVoucher.Bank.AccountName,
                                        Date = x.Date,
                                        ChequeNo = x.BankDepositVoucher.ChequeNo,
                                        Narration = x.BankDepositVoucher.Narration,
                                        SlipNo = x.BankDepositVoucher.SlipNo,
                                        TotalAmount = x.TotalAmount,
                                        IsCleared = x.BankDepositVoucher.IsCleared
                                    }).ToListAsync();
            }
            catch (Exception ex)
            {
                Console.WriteLine("", ex.Message);

            }
            return PartialView(model);
        }

这是抛出上述异常的部分

model.Vouchers = await Vouchers.OrderByDescending(x => x.VoucherNumber)
                                    //.Skip((model.Pager.CurrentPage - 1) * model.Pager.PageSize)
                                    //.Take(model.Pager.PageSize)
                                    .Select(x => new BankDepositVoucherBaseViewModel
                                    {
                                        Id = x.Id,
                                        VoucherNumber = x.VoucherNumber,
                                        AccountName = x.BankDepositVoucher.AccountName,
                                        BankAccountName = x.BankDepositVoucher.Bank.AccountName,
                                        Date = x.Date,
                                        ChequeNo = x.BankDepositVoucher.ChequeNo,
                                        Narration = x.BankDepositVoucher.Narration,
                                        SlipNo = x.BankDepositVoucher.SlipNo,
                                        TotalAmount = x.TotalAmount,
                                        IsCleared = x.BankDepositVoucher.IsCleared
                                    }).ToListAsync();

问题可能是,填充视图模型时,它无法处理记录可能没有BankDepositVoucher的事实。

例如: IsCleared = x.BankDepositVoucher.IsCleared

这可能应该是: IsCleared = x.BankDepositVoucher?.IsCleared ?? false IsCleared = x.BankDepositVoucher?.IsCleared ?? false

提高性能的另一件事:

虽然在代码中看起来很简洁,但可以编写如下语句:

.Where(x => x.Type == InvoiceType.BankDepositVoucher
    && (x.VoucherNumber == search.VoucherNo || search.VoucherNo == null)
    && (x.BankDepositVoucher.SlipNo.Contains(search.SlipNo) || search.SlipNo == null)
    && (x.BankDepositVoucher.ChequeNo.Contains(search.ChequeNo) || search.ChequeNo == null)
    && (x.BankDepositVoucher.Bank.AccountName.Contains(search.BankDetails)
        || search.BankDetails == null)
    && (x.BankDepositVoucher.AccountName.Contains(search.AccountName) || search.AccountName == null)
    && (x.BankDepositVoucher.Narration.Contains(search.Narration) || search.Narration == null)
    && (x.TotalAmount == search.Amount || search.Amount == null)
    && (x.Date >= search.StartDate || search.StartDate == null)
    && (x.Date <= search.EndDate || search.EndDate == null));

将其写为:

.Where(x => x.Type == InvoiceType.BankDepositVoucher);

if(!string.IsNullOrEmpty(search.VoucherNo))
    Voucher = Voucher.Where(x => x.VoucherNumber == search.VoucherNo);
if(!string.IsNullOrEmpty(search.SlipNo))
    Voucher = Voucher.Where(x => x.BankDepositVoucher.SlipNo.Contains(search.SlipNo))
// etc.

原因是,在第一种情况下,您将生成一个更大的SQL语句以发送到数据库,并且如果将来要对该查询进行编辑,则很容易在一定条件下“向上滑动”。 (缺少括号等)。第二个示例仅在需要时将条件添加到查询中,从而使生成的SQL语句更紧凑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM