Порядок в заявлении LINQ неэффективен - PullRequest
0 голосов
/ 04 декабря 2011

У меня проблемы с наведением порядка в выражении LINQ, над которым я работал. Вот код:

public static List<Contact> GetAllTheCusts(string fName,
    string lName,
    string middleName,
    int? customerId, 
    string sort, 
    int pageIndex, 
    int pageSize)
{
    AWEntities entities = Common.GetContext();

    int skipCount = pageSize * pageIndex;

    var contacts = entities.Contacts
        .Include("Individuals.Customer")
        .Where(c => customerId.HasValue
                        ? c.Individuals.Any(i => i.CustomerID == customerId.Value)
                        : c.Individuals.Any(i => i.Customer.CustomerID == i.CustomerID))
        .Where(c => string.IsNullOrEmpty(fName) || c.FirstName.Contains(fName))
        .Where(c => string.IsNullOrEmpty(lName) || c.LastName.Contains(lName))
        .Where(c => string.IsNullOrEmpty(middleName) || c.MiddleName.Contains(middleName));
        .Select(c => c);

    IOrderedQueryable<Contact> contactsOrdered = contacts.OrderByDescending(o => o.ContactID);;

    return contactsOrdered.Skip(skipCount).Take(pageSize).ToList();

}

По какой-то причине метод OrderByDescending не выполняет свою роль. Кто-нибудь может помочь, пожалуйста.

Приветствия

1 Ответ

0 голосов
/ 11 декабря 2011

Думал, что выложу окончательный рабочий код здесь Это успешно преобразовало хранимую процедуру в LINQ-to-Entities:

public static List<Contact> GetCustomersWithContactDetails(string fName, string lName, string middleName, int? customerId, 
        string sort, int pageIndex, int pageSize, out int count)
    {
        AWEntities entities = Common.GetContext();

        int skipCount = pageSize * pageIndex;

        var contacts = entities.Contacts
            .Include("Individuals.Customer")
            .Where(c => customerId.HasValue
                            ? c.Individuals.Any(i => i.CustomerID == customerId.Value)
                            : c.Individuals.Any(i => i.Customer.CustomerID == i.CustomerID))
            .Where(c => string.IsNullOrEmpty(fName) || c.FirstName.Contains(fName))
            .Where(c => string.IsNullOrEmpty(lName) || c.LastName.Contains(lName))
            .Where(c => string.IsNullOrEmpty(middleName) || c.MiddleName.Contains(middleName));

        //  Get ordering based on the "sort" parameter
        var contactsOrdered = GetOrdering(sort, contacts);

        count = contacts.Count();

        return contactsOrdered.Skip(skipCount).Take(pageSize).ToList();
    }

    private static IOrderedQueryable<Contact> GetOrdering(string sort, IQueryable<Contact> contacts)
    {
        IOrderedQueryable<Contact> contactsOrdered;

        if (string.IsNullOrEmpty(sort))
        {
            contactsOrdered = contacts.OrderBy(o => o.LastName);
        }
        else
        {
            SortDirection sortDirection = sort.EndsWith("ASC", StringComparison.Ordinal)
                                              ? SortDirection.asc
                                              : SortDirection.desc;


            switch (sort.Substring(0, sort.IndexOf(' ')))
            {
                case "ContactID":
                    {
                        if (sortDirection == SortDirection.asc)
                        {
                            contactsOrdered = contacts.OrderBy(o => o.ContactID);
                        }
                        else
                        {
                            contactsOrdered = contacts.OrderByDescending(o => o.ContactID);
                        }
                        break;
                    }
                case "LastName":
                    {
                        if (sortDirection == SortDirection.asc)
                        {
                            contactsOrdered = contacts.OrderBy(o => o.LastName);
                        }
                        else
                        {
                            contactsOrdered = contacts.OrderByDescending(o => o.LastName);
                        }
                        break;
                    }
                case "FirstName":
                    {
                        if (sortDirection == SortDirection.asc)
                        {
                            contactsOrdered = contacts.OrderBy(o => o.FirstName);
                        }
                        else
                        {
                            contactsOrdered = contacts.OrderByDescending(o => o.FirstName);
                        }
                        break;
                    }
                case "MiddleName":
                    {
                        if (sortDirection == SortDirection.asc)
                        {
                            contactsOrdered = contacts.OrderBy(o => o.MiddleName);
                        }
                        else
                        {
                            contactsOrdered = contacts.OrderByDescending(o => o.MiddleName);
                        }
                        break;
                    }

                default:
                    {
                        contactsOrdered = contacts.OrderBy(o => o.ContactID);
                        break;
                    }
             }

        }
        return contactsOrdered;
    }

Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...