2016-10-10 3 views
1

In einer Linq-Projektion für eine EF-Entity kann ich nur die Eigenschaften auswählen, die benötigt werden.Linq verschachtelte Projektionen in Entity Framework

Im folgenden Code ex Fragen. Jetzt hat Frage Navigationseigenschaft als Optionen. Ich möchte nur die Möglichkeit id und Option Titel als verschachtelte Eigenschaft

wählen Wenn ich

options.ToList() 

schreiben, wird es mit allen Eigenschaften arbeiten.

Ich möchte nur Options.ID und Options.Title zu

enthalten sein
var query = from c in context.Sec_Questions.AsNoTracking() 
      where c.IsActive == true 
      select new 
        { c.ID, c.QuestionType, 
        c.Title, c.ControlName, 
        c.IsNumberOnly, 
        c.Maxlenghth, 
        options = c.Options.ToList(), 
        c.IsMultiple, 
        c.ControlID, 
        c.HelpText, 
        c.IsRequired }; 
var questions = query.ToList(); 

Aber dieser Code funktioniert nicht

var query = from c in context.Sec_Questions.AsNoTracking() 
      where c.IsActive == true 
      select new 
        { c.ID, c.QuestionType, 
        c.Title, c.ControlName, 
        c.IsNumberOnly, 
        c.Maxlenghth, 
        options = new { c.Options.ID, c.options.Title }, 
        c.IsMultiple, 
        c.ControlID, 
        c.HelpText, 
        c.IsRequired }; 
var questions = query.ToList(); 
+0

Versuch FirstOrDefault zu verwenden, wenn die Optionen Listentyp ist nicht Eigentum vaule direkt aus der Liste mit der Auswahl bestimmte Instanz bekommen –

+0

Warum ist Optionen ein Listenobjekt? Muss es sein? Wenn Sie ein Listenobjekt haben, müssen Sie nur ein Element im Array auswählen, um die Eigenschaften zu erhalten. Ich verwende normalerweise FirstOrDefault: options = new {c.Options.FirstOrDefault(). ID, c.optionsFirstOrDefault(). Titel}, – jdweng

Antwort

2

Von diesem c.Options.ToList() Ich verstehe, dass Options eine Sammlung ist. Also, was Sie tun sollen, ist .Select verwenden nur diese beiden Eigenschaften, die ein neues Objekt zu projizieren:

var query = from c in context.Sec_Questions 
      where c.IsActive == true 
      select new { 
       c.ID, 
       c.QuestionType, 
       c.Title, 
       c.ControlName, 
       c.IsNumberOnly, 
       c.Maxlenghth, 
       Options = c.Options.Select(o => new { o.ID, o.Title }), 
       c.IsMultiple, 
       c.ControlID, 
       c.HelpText, 
       c.IsRequired }; 
+0

@ user3815413 - hat Ihnen das dabei geholfen, das Problem zu lösen? –

Verwandte Themen