C# 林克:“我不知道。”;Union或Concat中的类型构造不兼容。”;
我对ASP.NET和LINQ比较陌生,但我遇到了一个非常奇怪的行为,几乎让我发疯。我发现了一些关于标题中提到的错误的讨论,但似乎没有一个适合我的问题。请从对象关系设计器中查看以下快照: 正如您所看到的,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列表,检索所有这些锚参与的
关系
表示两个锚点
的连接。因此,有两个外键是为表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;