使用C#MVC5 Visual Studio 2015。
我有一个包含以下代码的方法:
public List<OffersOnPropertyViewModel> Build(string buyerId)
{
var filtered = _context.Properties.Where(x => x.Offers.Any(c => c.BuyerUserId == buyerId)).ToList();
var model = filtered.Select(c =>
{
var item = new OffersOnPropertyViewModel()
{
PropertyType = c.PropertyType,
NumberOfBedrooms = c.NumberOfBedrooms,
StreetName = c.StreetName,
Offers = c.Offers.Where(d => d.BuyerUserId == buyerId).Select(x => new OfferViewModel
{
Id = x.Id,
Amount = x.Amount,
CreatedAt = x.CreatedAt,
IsPending = x.Status == OfferStatus.Pending,
Status = x.Status.ToString(),
BuyerUserId = x.BuyerUserId
}),
};
return item;
}).ToList();
//TODO: refactor, shorten linq, duping where clause
return model;
}
这是模型:
public class Property
{
[Key]
public int Id { get; set; }
[Required]
public string PropertyType { get; set; }
[Required]
public string StreetName { get; set; }
[Required]
public string Description { get; set; }
[Required]
public int NumberOfBedrooms { get; set; }
[Required]
public string SellerUserId { get; set; }
public bool IsListedForSale { get; set; }
public ICollection<Offer> Offers { get; set; }
}
在“ DB优惠”表中,属性ID为FK。
该方法在运行时失败,表明Value不能为null。
当我逐步浏览时,我注意到过滤后的结果(在示例中为1个结果),是说offer为空。尽管查询只是根据“ x.Offers”过滤了结果。
我只需要一种方法来检索具有由所提供的BuyerId提供的要约的属性列表。我的方法错了吗?还是我缺少一个班轮?
谢谢
最佳答案
您需要将Include()
添加到LINQ查询中以引入子对象,如下所示:
var filtered = _context.Properties.Include("Offers")
.Where(x => x.Offers.Any(c => c.BuyerUserId == buyerId)).ToList();
您的过滤器与
Any()
一起使用的原因是因为生成SQL查询时,该部分形成WHERE
子句,并且不包含在SELECT
中。关于c# - Linq值在FK上不能为null,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42026976/