2013-02-25 3 views
0

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

list = list.Where(c=> c.CustomerSalesPeople.Count>0); 

но я получаю нулевое исключение при попытке вернуть результаты

return list.OrderBy(c => c.CustomerName).ToList(); 

Я перешагнул код и увидел нулевое исключение, сгенерированное сразу после того, как я выполнил первый оператор. Есть ли лучший способ достичь этого.

EDIT

Я попытался предложения и я все еще получаю нулевое значение. Я подумал, что лучше попытаюсь объяснить. Мне нужен лямбда-выражение, которое соответствует этому запросу,

SELECT * 
    FROM [customer] 
    where customer_record_id in (select distinct(customer_id)from customer_sales_person) 
+0

Это linq к объектам/sql/entity? – MarcinJuraszek

+0

его linq к объектам. это llblgen Entities. LLBLGen это ORM – ChampChris

+0

проверить мой ответ сейчас –

ответ

1
list = list.Where(c=>c.CustomerSalesPeople.Count>0).SingleOrDefault(); 

if(list!=null) 
    return list.OrderBy(c=>c.CustomerName).ToList(); 

return list; 

или если вы думаете, CustomerSalesPeople может быть пустым, то вы можете сделать это:

list = list.Where(c=>(c.CustomerSalesPeople==null) ||(c.CustomerSalesPeople.Count>0)); 

if(list!=null) 
    return list.OrderBy(c=>c.CustomerName).ToList(); 

return list; 

также вы можете посмотреть на .DefaultIfEmpty() расширения.

Linq предоставляет отличные методы расширения для счетчика, когда найден пустый набор результатов. вот они:

  1. .FirstOrDefault()
  2. .DefaultIfEmpty()
  3. .SingleOrDefault()

UPDATE:

сделать это:

List<int> uniqueIds= listOfCustomerSalesPerson.Select(s=>s.Id).ToList().Distinct(); 
    var requireListOfCustomers = GetAllCustomers().Where(s=>uniqueIds.Contains(s.id); 

, вы также можете вставлять эти два отдельных вызова в один. но в зависимости от типа поставщика данных, который вы используете, он может дать вам ошибку, например, «use only primitive types». Добавить отдельный список идентификаторов.

например, если вы используете EntityFramework 5.0 и SQL Server, вы можете это сделать.

myDbContext db= new myDbContext(); 
var requiredList = db.Customers.Where(s=> 
           (s.CustomerSalesPeople ==null) 
           || 
           (s.CustomerSalesPeople.Select(o=>o.Id).Contains(s.Id)) 
           ).ToList(); 

я предполагал, клиент содержит List<CustomerSalesPeople>, это может быть db.CustomerSalesPeople иначе

+0

Я изменил Select на Any, и он отлично работал. Не думаю, что я знал о передаче родительской переменной s в подзапрос в качестве параметра. благодаря – ChampChris

0

Вы можете иметь нулевые элементы в вашей коллекции. Попытайтесь проверить нули, в которых ведомость

return list != null ? 
    list.Where(c=> c!=null && c.CustomerSalesPeople.Count>0). 
    OrderBy(c => c.CustomerName).ToList() 
    :null; 
Смежные вопросы