Linq2sql查询问题

时间:2009-03-22 13:36:38

标签: c# linq-to-sql

我在使用linq2sql查询时遇到问题:

public IEnumerable List(IQueryable<Enquiry> enquiries, Supplier supplier)
{


    IEnumerable result = from e in enquiries
                         let order = supplier==null ? null : e.Orders.Where(f => f.ClientId.Equals(supplier.Id)).FirstOrDefault() 
                         let enquiryUser = e.Client.ClientUsers.First()
                         select new
                         {
                             Id = e.Id,
                             Name = e.Name,
                             PublicId = EnquiryMethods.GetPublicId(e.PublicId),
                             Price = supplier==null ? 0 : EnquiryMethods.GetPrice(e, supplier),
                             What = e.WorkType.DescriptionText,
                             Where = e.EnquiryArea.DescriptionText,
                             Who = e.EnquiryType0.DescriptionText,
                             When = e.EnquiryTime0.DescriptionText,
                             PriceRange = e.EnquiryPrice0.DescriptionText,
                             DisplayPriceRange = e.EnquiryPrice0.Display,
                             NbrOrders = e.Orders.Count(),
                             Description = StringUtils.Nl2Br(e.Description??""),
                             Published = e.EnquiryPublished,
                             HasPurchased = order!=null,
                             BuyerFirstName = order!=null ? enquiryUser.FirstName : "",
                             BuyerLastName = order!=null ? enquiryUser.LastName : "",
                             BuyerPhone = order!=null ? enquiryUser.Phone : "",
                             BuyerCellphone = order!=null ? enquiryUser.Cellphone : "",
                             BuyerEmail = order!=null ? enquiryUser.Email : "",
                             EnquiryMessage = order!=null ? StringUtils.Nl2Br(order.EnquiryMessage??"") : "",
                             OrderId = order!=null ? (Guid?)order.Id : null
                         };

    return result;
}

当传递not-null供应商时,它工作文件,但当向供应商传递null时,我得到“NullReferecenceException未被用户代码处理”。

我的理论是linq2sql不满意X? Y:Z操作,似乎Z(“e.Orders.Where(f => f.ClientId.Equals(supplier.Id)).FirstOrDefault()”)总是被评估?我通过supplier==null ? Guid.Empty : supplier.Id解决了这个问题,但我仍然无法使其余的查询工作(顺序!= null parst break,通过注释除了一个以外的所有内容来解决这个问题)。

奇怪的是e.Orders.Where(f =&gt; f.ClientId.Equals(supplier.Id))。FirstOrDefault()在供应商非空且查询有效的情况下给出null。 null和null之间有区别吗?

你会怎么写这个?

1 个答案:

答案 0 :(得分:3)

我不知道这是否有效,但请尝试更改:

let order = supplier==null
               ? null
               : e.Orders.Where(f => f.ClientId.Equals(supplier.Id))
                         .FirstOrDefault()

let order = e.Orders.Where( f => supplier != null
                                 && f.ClientId.Equals(supplier.Id) )
                    .FirstOrDefault()

因为你说它在评估第二部分时有效。