使用Linq填充IEnumerable <mytype>会产生错误&#34; LINQ to Entities不支持指定的类型成员。&#34; </mytype>

时间:2015-04-14 22:39:50

标签: linq odata ienumerable

我有一个模型,其中一些字段直接映射到数据库表,我通过Odata(v4)公开它。我创建了一个未映射的属性,它是一个IEnumerable,我在webapiconfig中映射它的运行时。我的模型看起来像这样

public class MyClass
{
public int ID {get;set;}
public string Name {get;set;}    
[NotMapped] 
[ForeignKey("MyType")]
public virtual IEnumerable<MyType> MyCollection { get { return context.MyCollection.AsQueryable(); } set { ;} }

}

现在,当我运行它并尝试获取url的结果时 http://localhost/ODataService/MyClass(1)?$ expand = MyCollection,它给我一个错误说             &#34; message&#34;:&#34;指定的类型成员&#39;测试&#39; LINQ to Entities不支持。仅支持初始化程序,实体成员和实体导航属性。

有人能指出如何使用linq填充Ienumerable运行时吗?

感谢。

2 个答案:

答案 0 :(得分:0)

错误是说您的类型没有映射到某个数据库实体。我猜MyType是一个C#类型,没有db等价物(似乎你在问题中说过)。 IEnumerable<MyType>非常好,但是当你使用它时,它需要在LINQ to Objects而不是LINQ to Entities或LINQ to SQL的上下文中。如果你想在运行时填充IEnumerable<MyType>,那么这样做的正确方法就是这样;

  IEnumerable<MyType> myTypes = SomeCollectionFromMyDb.Select(x => new MyType { FieldOnMyType=x.ColumnA, OtherField=x.ColumnB });

基本上,您应该在LINQ to Entities集合中使用Select,在需要时将实体投影到MyType 的实例中。

答案 1 :(得分:0)

所以,我通过删除ForeignKey并将Ienumerable更改为IList来解决此问题。 OdataV4根据主键计算出关系,因此如果MyType定义了一个键,它就建立了一种关系。

public class MyClass
{
[Key]
public int ID {get;set;}
public string Name {get;set;}    
public virtual IList<MyType> MyCollection { get ; } set { ;} }
}