Преобразование сохраненного процесса в LINQ для объектов - PullRequest
0 голосов
/ 21 ноября 2011

Пожалуйста, см. ПРАВКА внизу для текущего статуса моего вопроса.

Я преобразовываю хранимую процедуру в LINQ to Entities и добиваюсь некоторого прогресса. Но я запутался в следующем:

В предложении WHERE SP нулевые значения передаются следующим образом:

WHERE (@customerId IS NULL OR (CUST.CustomerID = @customerId))

До сих пор я придумал следующее:

return entities.Contacts
    .Include("Individuals")                
    .Where(c => customerId.HasValue && c.Individuals.Any(i => i.CustomerID == customerId.Value))
    .Select(c => c)
    .OrderBy(o => o.LastName)
    .Take(10)
    .ToList(); 

Это не работает вообще. 0 предметов возвращены. Может кто-нибудь посоветовать, как это можно перевести на синтаксис LINQ. Спасибо!

Edit: Я почти получил это. Единственная ложка дегтя сейчас - это заказ. По какой-то причине заказ не соблюдается. Вот некоторый код:

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();

    }

Я был бы очень рад и благодарен за разрешение заказа. Спасибо

Ответы [ 3 ]

3 голосов
/ 21 ноября 2011

Фильтровать по customerId, только когда оно не равно нулю

var contacts = entities.Contacts;

if (customerId != null)
{
   contacts = contacts.Where(c => c.Individuals.Any(i => i.CustomerID == customerId.Value));
}

return contacts
    .OrderBy(o => o.LastName)
    .Take(10)
    .ToList(); 
0 голосов
/ 21 ноября 2011

Похоже, вы случайно использовали &&, где вы имеете в виду || в предложении where.

0 голосов
/ 21 ноября 2011

Будет ли следующая работа?

Where(c => !customerId.HasValue || (customerId.HasValue && c.Individuals.Any(i => i.CustomerID == customerId.Value)))
...