C# 数据集不支持System.Nullable<>';实体框架

C# 数据集不支持System.Nullable<>';实体框架,c#,sql,entity-framework,crystal-reports,C#,Sql,Entity Framework,Crystal Reports,我需要我的属性允许null,所以我将其声明为 Nullable<double> Nat_Salary 如果不从Nat_Salary中删除空值,我如何修复此错误?猜测一下,因为您显示的代码实际上根本没有提到或使用数据集/数据表,Crystal Reports正在内部将您的列表解压缩到数据表中,并自动创建列,但盲目地将可为null的SR1_结果.Nat_Salary传递给数据表.columns.Add(“Nat_Salary”,typeof(Nat_Salary))(或其反射等效项),

我需要我的属性允许null,所以我将其声明为

Nullable<double> Nat_Salary

如果不从
Nat_Salary
中删除空值,我如何修复此错误?

猜测一下,因为您显示的代码实际上根本没有提到或使用数据集/数据表,Crystal Reports正在内部将您的
列表解压缩到数据表中,并自动创建列,但盲目地将
可为null的SR1_结果.Nat_Salary
传递给
数据表.columns.Add(“Nat_Salary”,typeof(Nat_Salary))
(或其反射等效项),并且datatable反对将列声明为可为null

您必须调整传入对象的形状,最明智的做法是,它可能看起来像您创建的数据表,而不是让CR来完成

放弃
ToList
调用,编写一个循环/一些代码,创建一个数据表并填充它以传递给CR。可以将该列声明为具有
typeof(double)
AllowDbNull=true
,然后在填充时,如果Nat\u Salary为null,则不要为该列设置值

简单地说:

var dt = new DataTable();
...
dt.Column.Add("Nat_Salary", typeof(double)).AllowDbNull = true;
...

foreach(var x in db.Database.SqlQuery<SR1_Result>("SR1"))
  var ro = dt.Rows.NewRow();
  ...
  if(x.Nat_Salary.HasValue)
    ro["Nat_Salary"] = x.Value;
  ...
}
这会将SR1_结果更改为匿名类型,该类型的Nat_薪水不再是
可为空的
,而是普通的
双精度
,并且CR在内部转换为datatable时不会爆炸


在这两个代码示例中,
是您在
SR1\u Result
中的其他列。您必须列出它们,除非您想执行相同的反射“查看对象,列出其属性名称和类型,并将其转换为数据表,但如果属性可为空,则应用一些自定义逻辑”过程



或者,CR可能已经遇到了这种错误行为,并推出了CR的一个版本来检查属性是否可为Null,并生成一个列,允许nullable包装的类型为Null-检查更新/与CR对话(现在拥有它们的人)

我再运行一遍;这和数据集有什么关系?@CaiusJard我把从存储过程返回的数据集放在数据集中..并在Crystal Report中加载数据集您的帖子中没有提到数据集的代码?错误显示在这里--(rpt.SetDataSource(bs);)我猜
bs
是绑定源(这并不是真的相关),在您展示的代码中,您对
bs
所做的最新操作是将其数据源设置为
列表,而不是数据集
public partial class SR1_Result
{
    public int EmployeeCode { get; set; }
    public string EmployeeName { get; set; }
    public string JobName { get; set; }
    public System.DateTime Date_Hiring { get; set; }
    public Nullable <double> Nat_Salary { get; set; }
    public string AdministrationName { get; set; }
    public string DepartmentName { get; set; }
    public string BranchName { get; set; }
}
ALTER PROCEDURE [dbo].[SR1]
AS
BEGIN
    SELECT         
        EmployeeCode,EmployeeName,
        JobName,
        Date_Hiring,
        Nat_Salary,
        AdministrationName,
        DepartmentName,
        BranchName
    FROM            
        Employee_List_Code_Name_Jop_DateHiring s
END 
var dt = new DataTable();
...
dt.Column.Add("Nat_Salary", typeof(double)).AllowDbNull = true;
...

foreach(var x in db.Database.SqlQuery<SR1_Result>("SR1"))
  var ro = dt.Rows.NewRow();
  ...
  if(x.Nat_Salary.HasValue)
    ro["Nat_Salary"] = x.Value;
  ...
}
var r = db.Database.SqlQuery<SR1_Result>("SR1").Select(x =>
  ...,
  Nat_Salary = x.Nat_Salary.GetValueOrDefault(0),
  ...
);