- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题:
我正在使用 Linq.Dynamic 的修改版本根据 ajax 请求对数据表进行排序(请参见下面的代码)。到目前为止,它曾经工作正常。
但是,我有一个问题:
如果我有一个包含 NULL 值的数据表,即使只有一行中只有一个字段为 NULL,我也会得到这两个异常:
Object must be of type "string"
如果相邻的几个值为NULL:
At least one object must implement IComparable
这是我的代码
using System.Linq;
using System.Data;
using System.Linq.Dynamic;
// Pre:
// sidx: Sort Field
// sord: Sort order ["ASC", "DESC"]
// page: current page number
// rows: pagesize in rows
public static string TestPaging(string sidx, string sord, string page, string rows)
{
string strReturnValue = null;
using (System.Data.DataTable dtAllData = GetDataTable())
{
IQueryable<System.Data.DataRow> iqOrderedPagedData = null;
if (string.IsNullOrEmpty(sidx) || string.IsNullOrEmpty(sord))
iqOrderedPagedData = dtAllData.AsEnumerable().AsQueryable();
else
iqOrderedPagedData = dtAllData.AsEnumerable().AsQueryable().OrderBy(sidx + " " + sord);
Int32 iPageSize = string.IsNullOrEmpty(rows) ? 100 : System.Convert.ToInt32(rows);
Int32 iPageIndex = System.Convert.ToInt32(page) - 1;
iqOrderedPagedData = iqOrderedPagedData.Skip(iPageIndex * iPageSize).Take(iPageSize);
//using (System.Data.DataTable dtOrderedPagedData = MyCopyToDataTable(iqOrderedPagedData))
using (System.Data.DataTable dtOrderedPagedData = iqOrderedPagedData.CopyToDataTable())
{
cjqGrid jqGrid = new cjqGrid();
//jqGrid.total = dtAllData.Rows.Count / iPageSize + 1;
jqGrid.total = (int)Math.Ceiling((float)dtAllData.Rows.Count / (float)iPageSize);
jqGrid.page = iPageIndex + 1;
jqGrid.records = dtAllData.Rows.Count;
jqGrid.data = dtOrderedPagedData;
strReturnValue = null; // Serialize(jqGrid, true);
jqGrid = null;
} // End Using dtOrderedPagedData
} // End Using dtAllData
//Response.ContentType = "application/json";
return strReturnValue;
}
TestPaging("USR_Domain", "desc", "1", "10");
问题似乎是扩展方法CopyToDataTable ,在行:
if (!e.MoveNext ())
这使得它对表进行排序,这意味着它调用了类中的函数 Compare System.Linq.SortSequenceContext
在这一行抛出错误
comparison = comparer.Compare(keys[first_index], keys[second_index]);
这是来自 mono 的版本,带有我的修复程序,使该 mono 方法真正起作用。
但是,该错误也出现在普通的旧版 MS .NET 4.0 中。
(我需要单声道将我的 Linq 使用方法反向移植到 .NET 2.0)
public static DataTable CopyToDataTable<T> (this IEnumerable<T> source)
where T : DataRow
{
DataTable dt = new DataTable ();
IEnumerator<T> e = source.GetEnumerator ();
if (!e.MoveNext ())
throw new InvalidOperationException ("The source contains no DataRows");
foreach (DataColumn col in e.Current.Table.Columns)
dt.Columns.Add (new DataColumn (col.ColumnName, col.DataType, col.Expression, col.ColumnMapping));
CopyToDataTable<T> (source, dt, LoadOption.PreserveChanges);
return dt;
}
public static void CopyToDataTable<T> (this IEnumerable<T> source, DataTable table, LoadOption options)
where T : DataRow
{
if (object.ReferenceEquals(typeof(T), typeof(System.Data.DataRow)))
{
foreach (System.Data.DataRow drRowToCopy in source)
{
System.Data.DataRow drNewRow = table.NewRow();
for (int i = 0; i < drRowToCopy.ItemArray.Length; ++i)
{
drNewRow[i] = drRowToCopy[i];
} // Next i
table.Rows.Add(drNewRow);
} // Next dr
}
else
CopyToDataTable<T>(source, table, options, null);
}
即使一行中的一列中只有一个值是 NULL,也会出现问题...
谁能建议我如何解决这个问题?
或者当一个或两个字段为 NULL 时,我如何才能从 IEnumerable 生成 DataTable 而不会出现异常?
现在我通过在比较中捕获异常来“修复”它。
但这只是 .NET 2.0 的修复,我可以在其中执行此操作,因为此类不存在。
我需要一个真正适用于 .NET 4.0 的修复程序。
public override int Compare (int first_index, int second_index)
{
int comparison = 0;
try
{
comparison = comparer.Compare(keys[first_index], keys[second_index]);
}
catch (Exception ex)
{
//Console.WriteLine(ex.Message);
}
if (comparison == 0) {
if (child_context != null)
return child_context.Compare (first_index, second_index);
comparison = direction == SortDirection.Descending
? second_index - first_index
: first_index - second_index;
}
return direction == SortDirection.Descending ? -comparison : comparison;
}
PS:对于我的 Linq.Dynamic DataTable-OrderBy-Enhanced 版本,请参见此处:
http://pastebin.com/PuqtQhfa
最佳答案
好的,我得到了解决方案:
很明显,它与 System.DbNull 类型有关
首先,因为我的 DataTable 中只有字符串,所以我得到了错误消息:
Object must be of type "string"
但是字符串怎么可能不是字符串类型呢?当然只有当它是 DbNull 时。
如果你有两个相邻的 DbNull.Values,你当然会得到:
At least one object must implement IComparable
因为 DbNull 没有实现 IComparable。
毕竟,有趣的是,它只在排序列是一个具有 NULL 值的列时才会失败,但如果它是一个没有 NULL 值的列,它就可以完美地工作。
由于表本身包含所有空值,与顺序无关,因此 CopyToDataTable 有时不起作用是不合逻辑的,因为它每次都复制所有值,与顺序无关。
唯一合乎逻辑的结论是,在代码中调用 OrderBy 时不会执行它,只有在某些方法实际使用 OrderBy 生成的数据时才会执行。
快速谷歌搜索让我找到了这个 http://blogs.msdn.com/b/charlie/archive/2007/12/09/deferred-execution.aspx
只需要阅读前几行就可以知道问题所在:
This post covers one of the most important and frequently misunderstood LINQ features. Understanding deferred execution is a rite of passage that LINQ developers must undergo before they can hope to harness the full power of this technology.
所以我突然意识到我刚刚通过了通行权:)
显然,缺陷是 e.MoveNext()
在排序时触发比较,该比较在 DbNull 上失败,因为所说的 DbNull 没有实现 IComparable。
具有讽刺意味的是,数据表也可以使用 select 语句进行排序,这我最初并不知道(毕竟,我希望“order”方法被称为“order”,而不是“select”.. .)所以我只是将 Linq.Dynamic 中的 OrderBy 更改为
public static IQueryable OrderBy(this IQueryable source, string ordering, params object[] values)
{
if (source == null) throw new ArgumentNullException("source");
if (ordering == null) throw new ArgumentNullException("ordering");
if (object.ReferenceEquals(source.ElementType, typeof(System.Data.DataRow)))
{
using (DataTable dt = source.Cast<System.Data.DataRow>().CopyToDataTable())
{
return dt.Select("", ordering).AsQueryable();
}
瞧,错误消失了。
而且由于单独使用 Select 过滤它比使用 Linq.Dynamic 更有效(它制作所有数据的大约 3 个副本),我决定完全放弃 Linq.Dynamic。
我仍在使用 Linq take and skip,但将来我肯定会更不愿意使用 Linq。
延迟执行是非常危险的,因为它会导致非常难以追踪的错误。
“boooom”所需要的只是错误位置的空值,或缺少接口(interface)(以及缺少检查或缺少泛型限制,如本例所示)...
关于c# - CopyToDataTable : Why exactly does it throw an error if one field is NULL, 以及如何修复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12050513/
最近开始学习oracle和sql。 在学习的过程中,我遇到了几个问题,我的 friend 在接受采访时被问到这些问题。 SELECT * FROM Employees WHERE NULL IS N
这个问题在这里已经有了答案: Can we subtract NULL pointers? (4 个回答) 关闭 2 个月前。 是否定义了NULL - NULL? (char *)NULL - (ch
是否有推荐的方法(根据 .net Framework 指南)检查 null,例如: if (value == null) {//code1} else {//code2} 或 if (value !=
我正在尝试将值插入数据库,但出现这样的错误任何人都可以告诉我为什么该值为空,如下所示: An exception occurred while executing 'INSERT INTO perso
这个问题在这里已经有了答案: String concatenation with a null seems to nullify the entire string - is that desire
您好,我正在 Android 联系人搜索模块中工作。我正在查询下方运行。 cur = context.getContentResolver().query(ContactsContract.Data.
下面的 SQL 表定义说明了从我的 MYSQL 数据库创建表的语句之一,该数据库是由我公司的前开发人员开发的。 DROP TABLE IF EXISTS `classifieds`.`category
我主要有应用程序开发背景。在编程语言中 variable == null或 variable != null有效。 当涉及到 SQL 时,以下查询不会给出任何语法错误,但也不会返回正确的结果。 sel
我在尝试检查某些元素是否为 NULL 时遇到段错误或不。任何人都可以帮忙吗? void addEdge(int i, int j) { if (i >= 0 && j > 0)
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
在 SQL 服务器中考虑到以下事实:Col1 和 Col2 包含数值和 NULL 值 SELECT COALESCE(Col1,Col2) 返回一个错误:“COALESCE 的至少一个参数必须是一个不
下面查询的关系代数表达式是什么?我找不到“Is Null”的表达式。 SELECT reader.name FROM reader LEFT JOIN book_borrow ON reader.ca
我正在尝试使用三元运算符来检查值是否为 null 并返回一个表达式或另一个。将此合并到 LINQ 表达式时,我遇到的是 LINQ 表达式的 Transact-SQL 转换试图执行“column = n
我在给定的代码中看到了以下行: select(0, (fd_set *) NULL, (fd_set *) NULL, (fd_set *) NULL, &timeout); http://linux
var re = /null/g; re.test('null null'); //> true re.test('null null'); //> true re.test('null null')
这个问题在这里已经有了答案: 关闭 13 年前。 我今天避开了一场关于数据库中空值的激烈辩论。 我的观点是 null 是未指定值的极好指示符。团队中有意见的其他每个人都认为零和空字符串是可行的方法。
由于此错误,我无法在模拟器中运行我的应用: Error:null value in entry: streamOutputFolder=null 或 gradle - Error:null value
我正在尝试在 Android 应用程序中创建电影数据库,但它返回错误。知道这意味着什么吗? public Cursor returnData() { return db.query(TABLE
我一直在检查浏览器中的日期函数以及运行时间 new Date (null, null, null); 在开发工具控制台中,它给出了有效的日期 Chrome v 61 回归 Sun Dec 31 189
为什么 NA==NULL 会导致 logical (0) 而不是 FALSE? 为什么 NULL==NULL 会导致 logical(0) 而不是 TRUE? 最佳答案 NULL 是一个“零长度”对象
我是一名优秀的程序员,十分优秀!