Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 林克:“我不知道。”;Union或Concat中的类型构造不兼容。”;_C#_Asp.net_Linq_Linq To Sql_Notsupportedexception - Fatal编程技术网

C# 林克:“我不知道。”;Union或Concat中的类型构造不兼容。”;

C# 林克:“我不知道。”;Union或Concat中的类型构造不兼容。”;,c#,asp.net,linq,linq-to-sql,notsupportedexception,C#,Asp.net,Linq,Linq To Sql,Notsupportedexception,我对ASP.NET和LINQ比较陌生,但我遇到了一个非常奇怪的行为,几乎让我发疯。我发现了一些关于标题中提到的错误的讨论,但似乎没有一个适合我的问题。请从对象关系设计器中查看以下快照: 正如您所看到的,关系表示两个锚点的连接。因此,有两个外键是为表Relation定义的:Relation.AnchorIDFrom=>Anchor.AnchorID和Relation.AnchorIDTo=>Anchor.AnchorID。这些列都不能为空。我现在的目标是,给定一个锚ID列表,检索所有这些锚参与的

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

正如您所看到的,
关系
表示两个
锚点
的连接。因此,有两个外键是为表
Relation
定义的:
Relation.AnchorIDFrom=>Anchor.AnchorID
Relation.AnchorIDTo=>Anchor.AnchorID
。这些列都不能为空。我现在的目标是,给定一个锚ID列表,检索所有这些锚参与的
关系。以下是实现此目的的方法:

[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
}
[WebMethod]
公共字符串关系(字符串标记、列表锚定)
{
JavaScriptSerializer js=新的JavaScriptSerializer();
LinkItCoreDataContext dc=新LinkItCoreDataContext();
可交换关系=
从锚点在直流。锚点
其中anchorIDs.Contains(anchord.AnchorID)
//愚蠢的名称,因为对象关系设计器
//似乎不支持自定义名称:
来自anchor.Relations.Union中的关系(anchor.Relations1)
选择新的
{
relationID=relations.relationID,
anchorIDFrom=relation.anchorIDFrom,
anchorIDTo=relation.anchorIDTo,
relationTypes=来自Relationship.relationTypes中的类型
//又是愚蠢的名字:
选择type.RelationType1
};
返回js.Serialize(relationQry);//这里是发生错误的地方
}
在运行时,这给了我一个
NotSupportedException
声明Union或Concat中的类型是不兼容地构造的。我认为这很奇怪,因为表达式
anchor.Relations.Union(anchor.Relations1)
应该合并两个在语法意义上完全相等的东西。如果我将关键行从锚定中的关系更改为
。关系从锚定中的关系更改为
,或从锚定中的关系更改为
。关系1
一切正常。另外,添加
ToList()
(有时被称为解决方案)不会改变任何事情

我错过了什么?

你试过这个吗:

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


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

我尝试过类似的情况,但在实体框架中,相同的查询运行正常时,得到了相同的错误。因此,我认为您在这里遇到了一个bug(或“不受支持的功能”),您可能需要解决它。您可以通过改变查询来实现这一点:

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
      };

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

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

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

我解决这个问题的方法是:

我将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;
var lo=new DataLoadOptions();
LoadWith(t=>t.NESTEDTYPE);//“t”是此场景中的数据库对象。
LoadWith(t=>t.NESTEDTYPE2);
LoadWith(t=>t.NESTEDTYPE3);
//等等。
dc.LoadOptions=lo;
对于每个嵌套类型,必须指定一个loadwith。 您只能对每个“活动”数据上下文分配Loadoptions一次


我希望你能用这个解决你的问题

我知道那个问题。正如我前面提到的,所有参与列都不能为空。我尝试了两种方法。不幸的是,它们没有什么区别。正如我所写的,没有区别。这意味着:同样的错误。
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;