带有OrderBy的Func <t,tresult =“”>导致空字段出错

时间:2018-04-16 18:12:24

标签: linq

我继承了一些代码,也是一个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);
}

1 个答案:

答案 0 :(得分:0)

嘛!感谢johnny 5想知道为什么c.AccountId.ToString()正在使用中,我从func&lt;&gt;中提取了.ToString(),这似乎可以解决问题。

谢谢,约翰尼5!有时你只需要另一双眼睛!