Entity Framework中的Linq嵌套投影

4
在对一个EF实体进行Linq投影时,我能够选择只包含必需属性。
在下面的代码中,ex问题。现在问题有选项导航属性。 我想要选择只有选项id和选项标题作为嵌套属性。
如果我编写
options.ToList() 

它将适用于所有属性。

我只想包括Options.IDOptions.Title

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();

但是这段代码不起作用。
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();

如果选项是列表类型,尝试使用FirstOrDefault。您无法直接从选择特定实例的列表中获取属性值。 - Muhammad Nasir
为什么选项是一个列表对象?它需要吗?当您拥有一个列表对象时,您需要选择数组中的一个项目才能获取属性。我通常使用FirstOrDefault:options = new {c.Options.FirstOrDefault().ID,c.optionsFirstOrDefault().Title}。 - jdweng
1个回答

4

从这个 c.Options.ToList() 我了解到 Options 是一个集合。所以你需要使用 .Select 投影一个新的对象,仅包含那两个属性:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接