Linq Func<;T、 TResult>;使用OrderBy会导致空字段错误

Linq Func<;T、 TResult>;使用OrderBy会导致空字段错误,linq,Linq,我继承了一些代码,还有一个bug 该应用程序是一个使用EF的C#MVC网站。该视图在表中显示客户机(直接取自SQL Server数据库中的客户机表) 当被排序的字段有完整的数据(即没有空值)时,它工作正常。但是,一旦列具有空值,结果OrderBy就会抛出“对象引用未设置为对象实例”错误 恐怕我还不能完全胜任破解这个问题的任务;我们仍然需要根据用户选择的字段进行排序,即使除一条记录外的所有记录都有空值。是否有任何方法可以通过现有的代码结构实现这一点,或者通过重构可以更好地实现这一点 编辑:直到异常

我继承了一些代码,还有一个bug

该应用程序是一个使用EF的C#MVC网站。该视图在表中显示客户机(直接取自SQL Server数据库中的客户机表)

当被排序的字段有完整的数据(即没有空值)时,它工作正常。但是,一旦列具有空值,结果OrderBy就会抛出“对象引用未设置为对象实例”错误

恐怕我还不能完全胜任破解这个问题的任务;我们仍然需要根据用户选择的字段进行排序,即使除一条记录外的所有记录都有空值。是否有任何方法可以通过现有的代码结构实现这一点,或者通过重构可以更好地实现这一点

编辑:直到异常点的完整代码:

“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);
}
List_clients=db.Client.ToList();
i可数过滤客户端;
//检查过滤器。这是一个搜索,我们可以说它是空的
如果(!string.IsNullOrEmpty(param.sSearch))
{
var nameFilter=Convert.ToString(请求[“bSearch_1”]);//搜索字符串
var isNameSearchable=Convert.ToBoolean(请求[“bsearcable_1”]);//列可搜索吗?可选
filteredClients=_clients.Where(x=>x.Name.ToLower().Contains(param.sSearch.ToLower());
}
其他的
{
filteredClients=\u clients.OrderBy(x=>x.Name);
}
//排序列
var isNameSortable=Convert.ToBoolean(请求[“bSortable_1]”);
var sortcolumnidex=Convert.ToInt32(请求[“iSortCol_0”]);
Func 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()
: ""); // 索引0是隐藏的客户端ID
//排序方向
var sortDirection=请求[“sortdir_0”];//降序
如果(排序方向==“asc”)
{
//此行的结果生成异常
FilteredClient=FilteredClient.OrderBy(orderingFunction);
}
其他的
{
FilteredClient=FilteredClient.OrderByDescending(orderingFunction);
}

好吧!多亏johnny 5想知道为什么要使用c.AccountId.ToString(),我从func中取出了.ToString(),这似乎起到了作用


谢谢你,强尼5号!有时候你只需要另一双眼睛

为什么有2个排序列索引6?其次,为什么要返回一个字符串,为什么不传入IQueryable并使用if语句对其应用过滤呢。好问题!2.我继承了这段代码,所以我不能说为什么我会这样做。不过,这是整个方法的一部分,还应用了其他筛选(例如搜索)。最初的开发人员将一些工作进行了拆分,这就是他选择处理排序的方式;我介绍了ASC OrderBy,但是如果排序是DESC,它使用相同的orderingFunction,因此我假设在本例中为“设置一次,使用多次”。出现空引用异常似乎有点奇怪。你能展示完整的代码到你得到空引用异常的地方吗?而且,这段代码真的很奇怪
c.AccountId.ToString()
这不会返回AccountId而不是列的名称吗?即按5排序,而不是按
AccountId
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
filteredClients = filteredClients.OrderBy(orderingFunction);
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);
}