C# 是否在没有自定义类型的绑定字段上显示联接值?

C# 是否在没有自定义类型的绑定字段上显示联接值?,c#,asp.net,linq,C#,Asp.net,Linq,我有一个绑定到ICollection的GridView,它需要显示两列: <asp:GridView ID="UserAnswersGridView" runat="server"> <Columns> <asp:BoundField DataField="Question.Name" HeaderText="Question Name" SortExpression="QuestionID" /> <asp:

我有一个绑定到
ICollection
的GridView,它需要显示两列:

<asp:GridView ID="UserAnswersGridView" runat="server">
    <Columns>
         <asp:BoundField DataField="Question.Name" HeaderText="Question Name" SortExpression="QuestionID" />
         <asp:BoundField DataField="Score" HeaderText="Score" SortExpression="Score" />
    </Columns>
</asp:GridView>

对不起,如果这个解释不是很清楚

我相信
GridView
只支持立即类型的属性。是中继器还是类似的选择?这给了你更多的灵活性

或者,可以通过分部类向类型添加垫片特性:

namespace YourLinqNamespace {
    partial class UserAnswer {
        public string QuestionName {get {return Question.Name;}}
    }
}
您不能在筛选器(
Where
等)中使用此选项,但您应该能够在返回的对象上使用它,而不会出现问题。请注意,您可能希望使用
LoadWith
保存往返行程:

DataLoadOptions options = new DataLoadOptions();
options.LoadWith<UserAnswer>(x=>x.Question);
database.LoadOptions = options;
DataLoadOptions=newdataloadoptions();
options.LoadWith(x=>x.Question);
database.LoadOptions=选项;

您还可以使用ItemDataBoundEvent在代码隐藏中设置字段。或者您可以使用匿名类型,这有点像Marc的shim属性概念,但您不会修改域模型

 from u in database.UserAnswers
 Where u.UserAssessmentId == userAssessmentId
 select new { QuestionName=u.Question.Name,
              Answer = u.Answer
              //etc etc
            };
正如Marc指出的,您不应该从方法返回匿名类型,我在手动绑定到数据源时使用了以下技巧:

myGrid.DataSource=来自u等


在我看来,使用我的第一个建议更好,并在item data bound事件中处理它。

与Marc Gravell一样,我几乎总是为这些情况创建垫片属性。另一种选择是使用模板列而不是绑定列,但这实际上取决于您的情况:

<asp:TemplateField HeaderText="Question Name">
  <ItemTemplate>
    <%# Eval("Question.Name") %>
  </ItemTemplate>
</asp:TemplateField>


我以前从未听说过“垫片属性”-非常好的垫片,通过,选择你自己的术语-我掷骰子-pCheers,没有意识到我可以这么做:)。除了你不能从GetUserAnswers返回anon类型(干净的)。你可以通过对象来实现,但这并不完美。哦,是的,这是一个很好的观点…我想当我绑定到网格的数据源时,我会做到这一点。。。
<asp:TemplateField HeaderText="Question Name">
  <ItemTemplate>
    <%# Eval("Question.Name") %>
  </ItemTemplate>
</asp:TemplateField>