LINQ to SQL的动态排序是通过IN运算符实现的?

9rnv2umw  于 2023-04-27  发布在  其他
关注(0)|答案(2)|浏览(164)

我有以下LINQ查询:

using (var db = new MyDataContext()) {
    int[] onlineUsers = GetOnline();
    var users = (from u in db.Users orderby 
        (onlineUsers.Contains(u.u_username) && 
        u.u_hasvisible_photo) descending,
        u.u_lastlogin descending select 
        u.u_username).Skip(startRowIndex).
        Take(maximumRows).ToList();
}

这可以正常工作,并使用IN操作符生成SQL查询。
问题是int[]中的每个int都是通过不同的参数传递的,我知道SQL每个查询的参数限制为2100个。
我认为使用LINQ动态库OrderBy进行排序会更好。
使用.OrderBy(orderquery)代替“onlineUsers.Contains(u.u_username)&& u.u_hasvisible_photo)descending”。
我已经在网上搜索了指南或示例来实现这一点,但找不到任何帮助。社区能否提供代码或链接来帮助我实现这一点?

8fsztsew

8fsztsew1#

如果你使用的是SQL Server 2008,你可以创建一个标量函数,它接受一个table-valued parameter,然后将数组作为table-valued parameter传入。不过,这可能需要从LINQ提供程序中进行特殊的引导(你没有指定你使用的是哪一个(Linq-to-Entities还是Linq-to-SQL,我假设是SQL Server,尽管你只是说“sql”),所以我不确定查询的可组合性如何。
你可能想做的是创建一个table valued user-defined function,它接受表值参数(以及你可能有的任何其他参数),并通过LINQ公开它(你应该能够从表值函数创建一些可组合的东西),然后从那里继续。

kkbh8khc

kkbh8khc2#

这里有一个Linq to SQL的动态排序示例,示例使用的是Northwind数据库,您可以简单地使用**LinqPad**进行尝试:

void Main()
{

    // Demonstrates dynamic ordering

    var SortExpression = "Total"; // choose ProductName or Total
    var sortAscending = true; // choose true for ascending, false for descending

    // the query to sort
    var data = (from pd in Products
                        join od in OrderDetails on pd.ProductID equals od.ProductID into DetailsByProduct
                        select new { ProductName = pd.ProductName, Total = DetailsByProduct.Count()}).ToList();

    // the data source you can use for data binding                     
    var ds= (sortAscending) 
        ? data.OrderBy(x => x.GetType().GetProperty(SortExpression).GetValue(x, null))
        : data.OrderByDescending(x => x.GetType().GetProperty(SortExpression).GetValue(x, null));

    ds.Dump();
}

尝试用"ProductName"(变量SortExpression)替换"Total",或者使用false(变量sortAscending)进行降序排序。

相关问题