2009-09-24 115 views
5

通常我需要组合多个表中的数据并将结果显示在GridView控件中。Linq to SQL设计问题

我可以写在Page_Load事件LINQ查询在线,返回结合,我需要的所有字段匿名类型,数据绑定结果到GridView控件。

  • 问题:我使用Scott Guthrie on his blog描述的'帮手方法'。这种帮助方法不能返回匿名类型。查询将不得不内联这种方法。

我可以编写一个数据库视图,它返回我需要的数据,并用它返回的这个(新的和已知的)类型的查询编写一个帮助器方法。

  • 问题:在数据库模式中我需要很多视图,而且我会介绍很多数据的冗余方面。我也失去了使用Linq的一些优势 - 从数据库中删除所有业务逻辑。

我想采取的做法,让我保持LINQ查询的辅助方法,还可以让我访问,我需要在各自的数据绑定表达式网格中的所有属性。这可以做到吗?

+0

这是C#吗?如果是这样,您将通过添加C#标签获得更多视图。如果您使用的是GridView控件,我假设ASP.NET。 – 2009-09-24 17:06:41

+0

我不认为语言很重要。 – cdonner 2009-09-24 17:20:12

回答

1

我问了一个错误的问题,就像我经常这样做。是什么促使我查看匿名类型是GridView的明显限制 - 我无法在<asp:BoundField>(DataField参数只接受Linq查询引入的表的列名)中使用数据绑定表达式。

原来,在TemplateField中它可能使用Eval和Linq数据项的访问成员,Linq负责为我查询查询。 换句话说,我可以将查询保留在我的帮助器方法中,让它返回主数据库表类型(例如Account),并将帐户绑定到GridView。 在数据绑定表达式中,我可以访问驻留在其他表中的Account对象的数据成员,而不必在查询中明确地拉入它们。完善。

0

我不知道是否有实现这一目标使用匿名类型的可行方法。但我有一个建议,将在WinForms中工作,但我不确定ASP.NET。

你需要的是既没有属性的属性的名称数量,也没有类型,并在编译时已知性质的类型。一种创建这种东西的方法是ICustomTypeDescriptor

你必须创建一个类实现与支持该查询从查询​​一行返回的属性对象的私人后备存储这个接口。然后你实现GetProperties()返回一个PropertyDescriptor每列和PropertyDescriptor.GetValue()PropertyDescriptor.SetValue()访问支持数组。

通过实施PropertyDescriptor.Name你会得到正确的列名;这可能需要另一个后台存储存储属性名称。还有很多要实现,但最终你的新类型将表现得几乎像一个正常的类型 - 现在如果 - 如果你绑定的控件知道并使用ICustomTypeDescriptor

UPDATE

我刚刚找到的文本的位,说明ASP.NET数据绑定知道并使用ICustomTypeDescriptor

+0

@丹尼尔有趣的建议 - 事实证明,解决方案更简单,见我自己的答案。 – cdonner 2009-09-24 18:10:52

0

斯科特先前的帖子中关于塑造的结果插入到前栅格设置一系列会谈:

Part 3 - Querying our Database

向下滚动到“塑造我们的查询结果”。

+0

我也阅读了这部分内容,这正是我的困惑所在 - 在这一部分中,他使用内联查询将匿名类型绑定到网格,对于内联查询非常适用,但是当您遵循他的建议时,方法会崩溃从第9部分扩展DataContext。 – cdonner 2009-09-26 11:06:52