使用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/

10-13 00:02