我有一个模型,其中一些字段直接映射到数据库表,我通过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运行时吗?
感谢。
答案 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 { ;} }
}