2017-02-03 2 views
1

Verwendung von C# MVC5 Visual Studio 2015Linq Wert kann auf FK nicht null sein

Ich habe eine Methode, die den folgenden Code enthält:

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; 
    } 

Hier ist das Modell:

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; } 
} 

In der Tabelle DB-Angebote hat die Eigenschaft id als FK.

Die Methode schlägt zur Laufzeit fehl und sagt, dass der Wert nicht null sein kann.

Wenn ich durchtrete merke ich die gefilterten Ergebnisse (im Beispiel ist es 1 Ergebnis), sagt Angebote ist null. Obwohl die Abfrage nur die Ergebnisse basierend auf "x.Offers" gefiltert hat.

Ich brauche einfach einen Weg, um eine Liste von Immobilien, die Angebote von der käuferId zur Verfügung gestellt haben, abrufen. Ist meine Vorgehensweise falsch? oder fehlt mir ein Liner?

Dank

Antwort

3

Sie müssen Include() auf Ihre LINQ-Abfrage hinzuzufügen, in untergeordneten Objekte zu bringen, wie folgt:

mit dem Any()
var filtered = _context.Properties.Include("Offers") 
    .Where(x => x.Offers.Any(c => c.BuyerUserId == buyerId)).ToList(); 

Der Grund Ihre Filter funktioniert, weil, wenn die SQL-Abfrage zu erzeugen , dieser Teil bildet die WHERE Klausel und ist nicht in der SELECT enthalten.

+0

natürlich, komplett vergessen zu bringen Kinder über include .... seufzen, dass Freitag Gefühl – lemunk

Verwandte Themen