我在使用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之间有区别吗?
你会怎么写这个?
答案 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()
因为你说它在评估第二部分时有效。