LINQ to SQL динамический порядок с оператором IN?

У меня есть следующий запрос 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();
}

Это отлично работает и генерирует SQL-запрос с использованием оператора IN.

Проблема в том, что каждый int из int [] передается через другой параметр, и я знаю, что SQL имеет ограничение в 2100 параметров на запрос.

Я думаю, что для сортировки было бы лучше использовать динамическую библиотеку LINQ OrderBy.

Вместо "onlineUsers.Contains (u.u_username) && u.u_hasvisible_photo) по убыванию" используйте .OrderBy (orderquery).

Я искал в Интернете руководство или пример, чтобы сделать это, и не могу найти никакой помощи. Может ли сообщество помочь мне с кодом или ссылками, которые могут помочь мне в реализации этого?


person dan    schedule 30.12.2009    source источник


Ответы (2)


Если вы используете SQL Server 2008, вы можете создать скалярную функцию, которая принимает таблицу -значный параметр, а затем передайте в него массив. Это может потребовать специального согласования со стороны поставщика LINQ (вы не указали, какой из них вы используете (Linq-to-Entities или Linq-to-SQL, и я предполагаю, что SQL Server, даже если вы просто говорите "sql" ), поэтому я не уверен, насколько составным будет запрос.

Возможно, вы захотите создать определяемую пользователем функцию с табличным значением, который принимает параметр с табличным значением (и любые другие параметры, которые могут быть у вас) и раскрывает его через LINQ (вы должны иметь возможность создать что-то составное из функции с табличным значением), а затем продолжить оттуда.

person casperOne    schedule 30.12.2009

Вот пример для 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();
}

Попробуйте заменить "Total" на "ProductName" (переменная SortExpression) или отсортировать по убыванию с помощью false (переменная sortAscending).

person Matt    schedule 29.01.2013