linq查询仅包含详细信息的标头

时间:2013-02-25 07:32:46

标签: c# linq lambda

我正在尝试仅使用此Lambda语句获取具有详细信息的标头

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

但是当我尝试返回结果时,我得到一个null异常

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

我已经逐步完成代码,看到在执行第一个语句后立即生成了null异常。有没有更好的方法来实现这一目标。

修改

我尝试了这些建议,但我仍然得到一个空值。我想我会试着更好地解释一下。我需要一个匹配此Query

的Lambda表达式
    SELECT *
  FROM [customer]
  where customer_record_id in (select distinct(customer_id)from customer_sales_person)

2 个答案:

答案 0 :(得分:1)

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

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

return list;

或者如果你认为CustomerSalesPeople可以为null,那么你可以这样做:

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()
  4. 更新:

    这样做:

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

    你也可以将这两个单独的调用嵌入到一个中。但是根据您使用的数据提供商的类型,它可能会给您一个错误,例如“use only primitive types”。因此会有单独的ID列表。

    例如,如果您使用的是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

答案 1 :(得分:0)

您的集合中可以包含null元素。尝试检查where语句

中的空值
return list != null ? 
   list.Where(c=> c!=null && c.CustomerSalesPeople.Count>0).
   OrderBy(c => c.CustomerName).ToList()
   :null;