2012-03-27 93 views
2

我不知道如何将这篇文章的标题词组化。这是我想要做的:LINQ .Select()访问父属性?

invalidItems.AddRange(documents.SelectMany(doc => doc.Messages) 
      .Select(message => string.Format("Doc. Key {0}: {1}", doc.ID, message))); 

其中invalidItems是一个List和Document是一个包含一个名为消息的List属性的类。

我想得到一个所有文档的消息(字符串)的平坦列表,其中字符串被格式化为包含文档ID(类似于上面的String.Format())。有没有办法做到这一点?

当我与最后。选择()子句中的消息参数的工作,我无法在父文件访问任何...

回答

1

你只需要选择子句移动到喜欢你的条款的SelectMany这:

documents.SelectMany(
    doc => doc.Messages.Select(
     message => string.Format("Doc. Key {0}: {1}", doc.ID, message) 
    ) 
); 
+0

这做到了!感谢您的快速回复。 – lintmouse 2012-03-27 17:54:38

0

如果你想在你的查询更多的范围,查询理解语法可能是要走的路。

from doc in documents 
from message in doc.Messages 
select string.Format("Doc. Key {0}: {1}", doc.ID, message) 

这相当于:

documents 
.SelectMany(
    doc => doc.Messages, 
    (doc, message) => new {doc, message} 
) 
.Select(
    x => string.Format("Doc. Key {0}: {1}", x.doc.ID, x.message) 
) 
+0

不错,那也完全有效。我更喜欢查询表达式语法。 – lintmouse 2012-03-27 19:17:36