【发布时间】:2014-02-26 20:21:21
【问题描述】:
我正在使用实体框架和微风。对于实体,我想与实体一起提供一些相关数据。通过查询 Entity 表并连接到其他表来最有效地获取这些数据;此查询包括 group by 子查询。
我正在尝试通过将其作为 [NotMapped] 字段添加到实体来添加这些额外数据:
[NotMapped]
public string NotMappedField { get; set; }
那么我基本上是想替换这个webapi控制器方法
[HttpGet]
public IQueryable<MyObject> MyObjects()
{
return _contextProvider.Context.MyObjects;
}
这样的:
public IQueryable<MyObject> MyObjectsWithExtraData()
{
var query = from o in _contextProvider.Context.MyObjects
// big complex query
select new MyObject
{
FieldA = o.FieldA,
FieldB = o.FieldB,
// all fields
NotMappedField = x.ResultFromComplexJoin
}
return query;
}
这给了我一个错误:
无法在 LINQ to Entities 查询中构造实体或复杂类型“MyObject”。
我已经尝试了几种方法,它似乎在 EF 方面和 Breeze 方面都与我作战。我需要将其保留为返回 IQueryable 之类的内容,以便我可以通过 webapi 从客户端进行过滤,因为在此处执行 ToList() 之类的操作会由于数据集大小而导致内存问题。
所以我的问题是 - 是否有一种最佳实践方式来完成我正在尝试的事情,或者任何人都可以提供解决方案?
更新:
我发现您可以在实体旁边返回额外数据,并且仍然可以从 Breeze 中以可查询的形式访问实体:
public object MyObjectsWithExtraData()
{
var query = from o in _contextProvider.Context.MyObjects
// big complex query....
select new
{
theObject = MyObject,
NotMappedField = x.ResultFromComplexJoin
};
return query;
}
然后从客户端微风端你可以做这样的事情:
var query = breeze.EntityQuery
.from("MyObjectsWithExtraData")
.where("theObject.FieldA", "Equals", 1)
.expand("theObject.SomeNavigationalProperty")
.orderBy("theObject.FieldB");
仍然不是我想要的,但它实际上非常漂亮。
【问题讨论】:
-
为什么不在 HTTPResponse 中返回额外的数据,然后在完成查询后获取它?通过将参数传递给您的 .then(function (data) { console.log(data.httpResponse); } 来访问它
标签: c# linq entity-framework breeze