LINQ:如何在 LINQ 中动态使用 ORDER BY,但仅当变量不为 string.empty 或 null 时。

3

我正在使用LINQ2SQL并且它的表现相当不错。然而,根据C#中字符串类型变量的值,我需要在我的查询中使用“Order By”或不使用“order by”。

如果C#字符串不为空,则我想按照字符串变量的内容进行“排序”。如果C#字符串为空,则不包括“order by”。

是否可能编写此类查询?


您想要将那些空/Null项目排除掉还是将它们排序到顶部或底部? - strager
这个字符串包含什么?你想按哪个成员的名称排序?还是其他什么? - KristoferA
3个回答

2

分两步来完成:

var query = from .. in .. where .. select ..;

if (!string.IsNullOrEmpty(someVariable))
{
    query = query.OrderBy((..) => ..);
}

我认为OP的问题是,如果查询中的任何变量为空,则不按顺序排序。 - Serkan Hekimoglu
@Serkan:“根据C#中字符串类型变量的值”听起来像是顺序取决于单个变量。 - VVS
嗯,你说得对。抱歉,我刚才写错了答案 :) - Serkan Hekimoglu

2

按照VVS的回答进行操作,但如果你想要传递列名进行排序,你可能需要使用这个扩展方法而不是内置的OrderBy方法:

public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> query, string memberName)  
{  
    ParameterExpression[] typeParams = new ParameterExpression[] { Expression.Parameter(typeof(T), "") };  

    System.Reflection.PropertyInfo pi = typeof(T).GetProperty(memberName);  

    return (IOrderedQueryable<T>)query.Provider.CreateQuery(  
        Expression.Call(  
            typeof(Queryable),  
            "OrderBy",  
            new Type[] { typeof(T), pi.PropertyType },  
            query.Expression,  
            Expression.Lambda(Expression.Property(typeParams[0], pi), typeParams))  
    );  
} 

0

让 C# 检查列表的内容,只有在列表不包含 null 的情况下才进行排序。

var myList = (from s in dataContect.Users select s).ToList();

bool containsNull = false;

foreach (var item in mylist)
{
    if (string.IsNullOrEmpty(item.LastName))
    {
        containsNull = true;
    }
}

if (!containsNull)
{
    // If is not contains null, Use Order By
    myList = myList.OrderBy(k => k....);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接