как решить 'DataSet не поддерживает System.Nullable <>.'? - PullRequest
0 голосов
/ 25 октября 2018

Моя цель - экспортировать данные в файл PDF с использованием Crystal Report и Entity Framework, но, к сожалению, я получаю это сообщение об ошибке при попытке запустить мой код.

'System.NotSupportedException: 'DataSet не поддерживает System.Nullable <>.'

Может ли кто-нибудь любезно помочь мне?

Это то, что я пытался до сих пор на моей стороне контроллера

using System.Data.Entity;
using System.IO;
using Final_INF271.Reports;
using CrystalDecisions.CrystalReports.Engine;

public ActionResult Export()
{
    ReportDocument rd = new ReportDocument();
    rd.Load(Path.Combine(Server.MapPath("~/Reports/OutstandingOrders.rpt")));
    rd.SetDataSource(db.ProductOrder.Select(p => new
    {
        p.OrderID,
        p.Date,
        p.SupplierID,
        p.CostPrice,
        p.Quantity
    }).ToList());
    Response.Buffer = false;
    Response.ClearContent();
    Response.ClearHeaders();
    Stream stream = rd.ExportToStream
        (CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
    stream.Seek(0, SeekOrigin.Begin);
    return File(stream, "application/pdf", "OutstandingOrders");
}

В комплект входит мой ProductOrder

namespace Final_INF271.Models
{
    using System;
    using System.Collections.Generic;

    public partial class ProductOrder
    {
        public int OrderID { get; set; }
        public Nullable<System.DateTime> Date { get; set; }
        public Nullable<int> EmployeeID { get; set; }
        public Nullable<int> SupplierID { get; set; }
        public int ProductTypeID { get; set; }
        public Nullable<decimal> CostPrice { get; set; }
        public Nullable<int> Quantity { get; set; }

        public virtual Employee Employee { get; set; }
        public virtual ProductType ProductType { get; set; }
        public virtual Supplier Supplier { get; set; }
    }
}

ниже приведен рисунок набора данных и сообщения об ошибке

enter image description here

1 Ответ

0 голосов
/ 25 октября 2018

Метод Crystal Reports 'SetDataSource() создает DataColumn, предоставленный списком ProductOrder, и затем пытается создать DataColumn экземпляры, имеющие тип NULL, который не поддерживается.

Вы должны либосоздайте класс viewmodel, который имеет свойства с теми же базовыми типами, но без присутствующих обнуляемых типов, затем спроецируйте результат с этим классом в качестве источника данных:

// Viewmodel
public class ProductOrderVM
{
    public int OrderID { get; set; }
    public DateTime Date { get; set; }
    public int SupplierID { get; set; }
    public decimal CostPrice { get; set; }
    public int Quantity { get; set; }
}

// Controller action
rd.SetDataSource(db.ProductOrder.Select(p => new ProductOrderVM
{
    OrderID = p.OrderID,
    Date = p.Date.GetValueOrDefault(),
    SupplierID = p.SupplierID.GetValueOrDefault(),
    CostPrice = p.CostPrice.GetValueOrDefault(),
    Quantity = p.Quantity.GetValueOrDefault()
}).ToList());

Или используйте нулевой оператор объединения / троицы для назначения значений по умолчанию в соответствии сих базовый тип, если нулевые свойства имеют нулевое значение:

rd.SetDataSource(db.ProductOrder.Select(p => new
{
    OrderID = p.OrderID,

    // with ternary operator
    Date = p.Date == null ? DateTime.MinValue : p.Date, // or DateTime.Now as default value

    // with null-coalescing operator
    SupplierID = p.SupplierID ?? 0,
    CostPrice = p.CostPrice ?? 0,
    Quantity = p.Quantity ?? 0
}).ToList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...