2

我对 ASP.NET 和 LINQ 还比较陌生,但我遇到了一个非常奇怪的行为,几乎让我发疯。我发现了一些关于标题中提到的错误的讨论,但似乎没有一个适合我的问题。请查看来自对象关系设计器的以下快照:

ORD 的屏幕截图,显示了数据模型

如您所见,aRelation代表两个Anchors 的连接。因此,为此为表定义了两个外键RelationRelation.AnchorIDFrom => Anchor.AnchorIDRelation.AnchorIDTo => Anchor.AnchorID。这些列都不能为空。我现在的目标是,给定一个锚点的 ID 列表,检索所有Relation这些锚点参与的所有 s。这是实现此目的的方法:

[WebMethod]
public string GetRelations(String token, List<Guid> anchorIDs)
{
    JavaScriptSerializer js = new JavaScriptSerializer();
    LinkItCoreDataContext dc = new LinkItCoreDataContext();

    IQueryable relationQry =
        from anchor in dc.Anchors
        where anchorIDs.Contains(anchor.AnchorID)
        //stupid names because object relational designer
        //does not seem to support custom names:
        from relation in anchor.Relations.Union(anchor.Relations1)
        select new
        {
            relationID = relation.RelationID,
            anchorIDFrom = relation.AnchorIDFrom,
            anchorIDTo = relation.AnchorIDTo,
            relationTypes = from type in relation.RelationTypes
                            //stupid names again:
                            select type.RelationType1
        };
    return js.Serialize(relationQry);//Here's where the error occurs
}

在运行时,这给了我一个NotSupportedException说明Union 或 Concat 中的类型是不兼容构造的。我认为这很奇怪,因为表达式anchor.Relations.Union(anchor.Relations1)应该合并两个在句法意义上完全相等的东西。如果我将临界线更改为from relation in anchor.Relationsfrom relation in anchor.Relations1一切正常。此外,添加ToList()(有时被称为解决方案)不会改变任何东西。

我错过了什么?

4

3 回答 3

1

我尝试过类似的情况并得到相同的错误,而在实体框架中完全相同的查询运行良好。因此,我认为您在这里遇到了错误(或“不支持的功能”),您可能必须解决它。您可以通过转动查询来做到这一点:

var relationQry =
      from relation in anchor.Relations
      where anchorIDs.Contains(relation.AnchorIDTo) 
         || anchorIDs.Contains(relation.AnchorIDFrom)
      select new
      {
          relationID = relation.RelationID,
          anchorIDFrom = relation.AnchorIDFrom,
          anchorIDTo = relation.AnchorIDTo,
          relationTypes = from type in relation.RelationTypes
                          select type.RelationType1
      };

顺便说一句:您可以通过在设计器中选择关联及其子属性的名称来更改“愚蠢的名称”:)。

于 2013-06-23T19:34:05.723 回答
1

我遇到了同样的问题。最终我解决了这个问题。

看起来即使结果类型相等,使用嵌套关系也会导致错误。

我为解决这个问题所做的是:

我这样定义 DataLoadOptions :

var lo = new DataLoadOptions();

lo.LoadWith<Type>(t => t.NESTEDTYPE); // "t" is the database object in this scenario.
lo.LoadWith<Type>(t => t.NESTEDTYPE2);
lo.LoadWith<Type>(t => t.NESTEDTYPE3);

// etc.

dc.LoadOptions = lo;

对于每个嵌套类型,您必须指定一个加载项。您只能在每个“活动”数据上下文上分配一次加载选项。

我希望通过这个你将能够解决你的问题!

于 2019-06-25T16:32:39.907 回答
0

你有没有试过这个:

from relation in anchor.Relations.Concat(anchor.Relations1)

或者

from relation in anchor.Relations.Concat(anchor.Relations1).Distinct()

这第二个应该在功能上与 Union 相同,但我不相信它是你想要的,如果它是它可能会给出更好的错误消息。

于 2013-06-23T05:04:15.650 回答