【问题标题】:LINQ: How to dynamically use an ORDER BY in linq but only if a variable is not string.empty or nullLINQ:如何在 linq 中动态使用 ORDER BY,但前提是变量不是 string.empty 或 null
【发布时间】:2014-04-09 21:22:46
【问题描述】:

我正在使用 LINQ2SQL,它运行良好。但是,根据 C# 中变量类型字符串的值,我需要在查询中使用“Order By”或不使用“order by”。

如果 C# 字符串不为空或为空,那么我想对字符串变量的内容进行“排序”。如果 C# 字符串为空或 null,则我不包含 order by。

这样的查询可以写吗?

【问题讨论】:

  • 您要排除那些空/空项目还是将它们排序到顶部或底部?
  • 字符串包含什么?您要订购的会员的姓名?还是别的什么?

标签: c# linq linq-to-sql sql-order-by


【解决方案1】:

喜欢 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))  
    );  
} 

【讨论】:

    【解决方案2】:

    分两步完成:

    var query = from .. in .. where .. select ..;
    
    if (!string.IsNullOrEmpty(someVariable))
    {
        query = query.OrderBy((..) => ..);
    }
    

    【讨论】:

    • 我认为 OP 询问,查询中的任何变量如果为 null,则不排序。
    • @Serkan:“取决于 c# 中字符串类型变量的值”在我看来,排序取决于单个变量。
    • 嗯,是的,我认为你是对的,对不起。然后我写错了答案:)
    【解决方案3】:

    让 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....);
    }
    

    【讨论】:

      猜你喜欢
      • 2019-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      • 2013-06-06
      • 1970-01-01
      • 2017-02-06
      相关资源
      最近更新 更多