我继承了一些代码,也是一个bug。
该应用程序是使用EF的C#MVC网站。 VIEW在表中显示客户端(直接从SQL Server数据库中的CLIENTS表中获取)。
List<Client> _clients = db.Client.ToList();
IEnumerable<Client> filteredClients;
当用户单击标题以进行排序时,会出现问题。传递给控制器的args指示要排序的字段的索引(sortColumnIndex)。
原始开发人员创建了一个func来处理从索引到字段的转换。
Func<Client, string> orderingFunction = (c => sortColumnIndex == 1 ? c.Name.ToString()
: sortColumnIndex == 2 ? c.AccountExec.ToString()
: sortColumnIndex == 3 ? c.SalesforceLink.ToString()
: sortColumnIndex == 4 ? c.Location.ToString()
: sortColumnIndex == 5 ? c.PrimaryContact.ToString()
: sortColumnIndex == 6 ? c.AccountId.ToString()
: sortColumnIndex == 6 ? c.MongoClientId.ToString()
: ""); // index 0 is the hidden ClientId
结果用于OrderBy()子句。
filteredClients = filteredClients.OrderBy(orderingFunction);
当正在排序的字段具有完整数据(即没有NULL值)时,它可以正常工作。但是,只要列具有NULL值,生成的OrderBy就会抛出“未将对象引用设置为对象实例”错误。
我担心我不能完全解决这里破译解决方案的任务;我们仍然需要对用户选择的字段进行排序,即使除了一个记录之外的所有记录都具有NULL值。有没有办法用现有的代码结构实现这一点,还是通过重构更好地服务?
编辑:完整代码,直到例外:
“param”是包含所有过滤器等的参数。
List<Client> _clients = db.Client.ToList();
IEnumerable<Client> filteredClients;
//Check for filters. This is a search, and we can say it's empty for this purpose
if (!string.IsNullOrEmpty(param.sSearch))
{
var nameFilter = Convert.ToString(Request["bSearch_1"]); // Search string
var isNameSearchable = Convert.ToBoolean(Request["bSearchable_1"]); // Is column searchable? Optional
filteredClients = _clients.Where(x => x.Name.ToLower().Contains(param.sSearch.ToLower()));
}
else
{
filteredClients = _clients.OrderBy(x => x.Name);
}
// Sort Column
var isNameSortable = Convert.ToBoolean(Request["bSortable_1"]);
var sortColumnIndex = Convert.ToInt32(Request["iSortCol_0"]);
Func<Client, string> orderingFunction = (c => sortColumnIndex == 1 ? c.Name.ToString()
: sortColumnIndex == 2 ? c.AccountExec.ToString()
: sortColumnIndex == 3 ? c.SalesforceLink.ToString()
: sortColumnIndex == 4 ? c.Location.ToString()
: sortColumnIndex == 5 ? c.PrimaryContact.ToString()
: sortColumnIndex == 6 ? c.AccountId.ToString()
: ""); // index 0 is the hidden ClientId
// Sort Direction
var sortDirection = Request["sSortDir_0"]; // asc or desc
if (sortDirection == "asc")
{
//Results of this line generate exception
filteredClients = filteredClients.OrderBy(orderingFunction);
}
else
{
filteredClients = filteredClients.OrderByDescending(orderingFunction);
}
答案 0 :(得分:0)
嘛!感谢johnny 5想知道为什么c.AccountId.ToString()正在使用中,我从func&lt;&gt;中提取了.ToString(),这似乎可以解决问题。
谢谢,约翰尼5!有时你只需要另一双眼睛!