3

我有一个 LINQ 查询:

var result = from mt in MessageTypes
            join mtfmt in MessageTypeField_MessageTypes
                on new { MessageTypeID = mt.ID, MessageTypeFieldID = messageTypeFieldId } equals new { MessageTypeID = mtfmt.MessageTypeID, MessageTypeFieldID = mtfmt.MessageTypeFieldID }
            where (mt.StatusID == (int)status)
            select mt;

或 Lambda 语法,如果您愿意(我正在使用的那个)(messageTypeFieldID设置在来自参数的 var 调用之上。):

var messageTypes = context.MessageTypes
                .Join(
                context.MessageTypeField_MessageTypes,
                mt =>
                new
                    {
                        MessageTypeID = mt.ID,
                        MessageTypeFieldID = messageTypeFieldID
                    },
                mtfmt =>
                new
                    {
                        MessageTypeID = mtfmt.MessageTypeID,
                        MessageTypeFieldID = mtfmt.MessageTypeFieldID
                    },
                (mt, mtfmt) =>
                new
                    {
                        mt = mt,
                        mtfmt = mtfmt
                    }
                )
                .Where(x => (x.mt.StatusID == (int)status))
                .Select(x => x.mt);

我刚刚开始学习 LINQ 连接,并遇到了一种情况,即在我正在设置的新规范化(多对多)表中需要它,并且我希望返回所有消息类型,每个消息类型及其关联字段都位于“MessageTypeField_MessageType”下。

我的“MessageTypeField_MessageTypes”表是一个相当简单的标准化策略设置,就像这样,我应该说明即使 MessageTypeID“有很多”它是唯一数据,所以它可能是:

[ID | MessageTypeID | MessageTypeFieldID]
 1    63      10
 1    63      11
 1    63      12

现在上面的代码执行并返回一个我很满意的查询..(执行正确的 INNER JOIN)但是当我查看messageTypes.ToList()[0].MessageTypeField_MessageTypes例如快速观察时,我希望看到1 条记录,我得到了一整套 messageTypeField_MessageType 记录~17,过滤MessageTypeFieldID而不是过滤MessageTypeID。它应该在每次迭代时按消息类型 id 过滤,并且只返回一条记录。关于我做错了什么或如何实现我需要的任何想法?

对不起,这个复杂的例子,但我希望你们能帮助!

4

2 回答 2

3

如果您正在查看导航属性(即 的某个子集合mt),那么这与您的查询无关;听起来你想使用AssociateWith. 如果您只是想过滤子数据,这在很大程度上取代了连接......

于 2009-04-08T07:14:30.410 回答
0

考虑将您的选择更改为:

 select new 
 {
    MessageType = mt,
    MessageField = mtfmt
 }

正如 Marc 提到的,更改查询与导航属性无关。类似于上面的东西可能是你想要的。

如果你想坚持使用导航属性,你应该使用 AssociateWith 和 LoadWith 的组合。第一个过滤,然后使它成为一个急切的负载(所以你不会以多次往返结束)。

于 2009-04-08T07:34:41.720 回答