我遇到了一个问题。这是我的代码使用 LINQ。
var resultCases = from row2 in dtCases.AsEnumerable()
where row2.Field<int>("caseID") == caseID2
select new
{
caseName = row2["caseName"].ToString(),
caseCourtPlace = row2["caseCourtPlace"].ToString(),
caseCourtRef = row2["caseCourtRef"].ToString(),
caseOfficeRef = row2["caseOfficeRef"].ToString(),
effectiveDate = ((DateTime)row2["caseEffectiveDate"]),
closedDate = ((DateTime)row2["caseClosedDate"]),
caseFolderPath = row2["casesFolderPath"].ToString(),
category = row2["categoryName"].ToString(),
department = row2["departmentName"].ToString(),
empName = row2["empName"].ToString(),
judgeName = row2["judgeName"].ToString(),
asName = row2["asCasesName"].ToString(),
};
如果 closedDate
或 effectiveDate
返回 DBnull.Value
,我得到
InvalidCastException was unhandled - Specified cast is not valid.
那么我怎样才能避免这个错误呢?
最佳答案
tldr; 问题有两个方面:DataTable 使用 DBNull.Value
表示“空”值,既不 DBNull.Value
或 null
可浇注到 DateTime
.
Field<T>
后来添加了扩展方法,使处理具有空值的 DBNull 和 Nullable/引用类型变得更加容易;它还隐藏了强类型签名背后的转换。这些LINQ to DataSet扩展方法knows how to map DBNull.Value
to null
as appropriate .
因此使用 row.Field<DateTime?>("caseEffectiveDate")
将返回 任一个 DateTime?
带有一个值(如果查询返回一个值)或 null
,如果服务器返回不兼容的值,它也可能抛出异常 - 但它永远不会返回 DBNull.Value
.
但是,标准row["caseEffectiveDate"]
将返回 DateTime
值(或其他类型)或 DBValue.Null
这不能转换为DateTime?
(更不用说 DateTime
)并导致所描述的错误。
以下是如何最小化重现此异常:
object v = DBNull.Value;
DateTime dt = (DateTime)v;
但是,转换 null
没问题到 DateTime?
:
object v = null;
DateTime? maybeDt = (DateTime?)v;
然后很容易将其合并为 DateTime
如果需要:
object v = null;
DateTime? dt = (DateTime?)v ?? DateTime.MinValue;
关于c# - 当 DateTime 字段为 null 时 LINQ 中的 "Specified cast is not valid",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13548676/