2009-09-08 230 views
4

我使用C#.NET和LINQLINQ连接很多 - 很多关系

在我的LINQ模型我有三个数据库表:

LINQ MODEL http://img180.imageshack.us/img180/9827/linqmodel.jpg

下面的代码是我如何访问数据:

public IQueryable<tblAvailability> GetAvailabilitiesBySet(int id) 
    { 
     return (from a in dc.tblAvailabilities 
       where a.asID == id 
       select a).DefaultIfEmpty(); 
    } 

我显示数据到屏幕(通过中继器)。但是我似乎无法访问位于tblAppointmentType中的'appTypeName'。我以为我可以这样访问它:

<%#Eval("tblAvailabilities.tblAvailabilityAppointmentType.tblAppointmentType.appTypeName")%> 

但它不会让我访问tblAppointmentType。我究竟做错了什么?

感谢

克莱尔

+1

请提供确切的错误信息。从你的数据模型和代码中,我不知道它可能是你暗示的内容。我宁愿期待它抱怨'tblAvailabilities'。 – 2009-09-08 16:12:45

回答

0

我在第一个转发器中增加了另一个转发器,并访问了正确的数据库表。

0

你没有加入任何其他表的,因此结果只带回tblAvailabilities行。

var query = (from avail in dc.tblAvailabilitities 
     join aaTyp in dc.tblAvailabilityAppointmentType 
      on avail.availabilityID == aaType.availabilityID 
     join appType in dc.tblAppointmentType 
      on aaType.appTypeID == appType.appTypeID 
     select new { TypeName = appType.appTypeName }); 
0

对于您当前的模式,您可能会为tblAvailabilities中的每条记录的tblAvailabilityAppointmentType使用多个记录。这意味着在试图绑定到tblAppointmentType之前,您需要获取特定条目。另外,你不加入其他表来检索行(如果你想这样做)。

顺便说一句,真的很多很多,你想在这里?你的用法(以及我从你的命名推断出的概念)使你看起来像是一对多的关系。也许很多tblAvailabiliy记录,每个记录都引用一个tblAppointmentType?

如果您确实需要多对多,您可以很好地服务于使用GetAppointmentTypes()方法扩展tblAvailabilities类。这里是a decent article on codeproject

Othewise,请确保您的其他表中加入和引用tblAppointmentType右排

+0

每个可用性可以有多个AppointmentTypes – ClareBear 2009-09-09 07:51:24

3

LINQ2SQL不处理许多-2-许多良好,没有一点手把手...

删除tblAvailabiltyAppointmentType和tblAppoitmentType之间的链接。建立从tblAvailabiltyAppointmentType到tblAppoitmentType的新链接。点击该新链接即可访问该属性。将基数更改为OneToOne(因为您无法选择ManyToOne),请打开“Cild属性”部分,然后将名称更改为单数。

现在,当你执行你的问题有查询时,tblAvailability对象将有一个集合tblAvailabilityAppointmentTypes,而集合中的每个tblAvailabilityAppointmentType对象有一个属性对象tblAppointmentType,里面有你要找的appTypeName场。

var appTypes = GetAvailabilitiesBySet(99).tblAvailabilityAppointmentTypes. 
    Select(a=>a.appTypeName);