LINQ连接多对多关系

4

我正在使用c#.net和LINQ。

在我的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();
    }

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

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

但是我无法访问tblAppointmentType。我做错了什么吗?
谢谢
克莱尔

1
请提供精确的错误信息。从您的数据模型和代码中,我看不出它可能是您所暗示的那样; 我更倾向于认为它会抱怨“tblAvailabilities”。 - Pavel Minaev
4个回答

3
LINQ2Sql在没有一些手动干预的情况下无法很好地处理Many-2-Many关系...
删除tblAvailabiltyAppointmentType和tblAppoitmentType之间的链接。从tblAvailabiltyAppointmentType到tblAppoitmentType建立新的链接。点击该新链接以获取属性。将基数更改为OneToOne(因为您无法选择ManyToOne),打开Cild Property部分,并将名称更改为单数。
现在,当您执行问题中的查询时,tblAvailability对象将具有一个tblAvailabilityAppointmentTypes集合,该集合中的每个tblAvailabilityAppointmentType对象都将具有一个属性对象tblAppointmentType,该属性具有您正在查找的appTypeName字段。
var appTypes = GetAvailabilitiesBySet(99).tblAvailabilityAppointmentTypes.
    Select(a=>a.appTypeName);

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

我在第一个repeater中添加了另一个repeater,它访问了正确的数据库表。


0

根据您当前的模式,每个 tblAvailabilities 记录可能会有多个 tblAvailabilityAppointmentType 记录。这意味着在尝试连接到 tblAppointmentType 之前,您需要获取特定的条目。此外,如果您想以这种方式执行操作,则没有加入其他表来检索行。

顺便说一下,这里真的需要多对多吗?您的用法(以及我从您的命名中推断出的概念)使它看起来像是您想要一种一对多关系。也许有许多 tblAvailability 记录,每个记录引用一个 tblAppointmentType?

如果确实需要多对多,那么最好扩展 tblAvailabilities 类并使用 GetAppointmentTypes() 方法。这里有一个不错的CodeProject文章

否则,请确保加入其他表并引用 tblAppointmentType 中的正确行。


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