C# 如何使用IQueryable方法返回额外数据?
我正在使用实体框架和Breeze。对于一个实体,我想为该实体提供一些相关数据。通过查询实体表并连接到其他表,可以最有效地获取这些数据;此查询包括“分组依据”子查询 我正试图通过将此额外数据作为[NotMapped]字段添加到实体来添加它:C# 如何使用IQueryable方法返回额外数据?,c#,linq,entity-framework,breeze,C#,Linq,Entity Framework,Breeze,我正在使用实体框架和Breeze。对于一个实体,我想为该实体提供一些相关数据。通过查询实体表并连接到其他表,可以最有效地获取这些数据;此查询包括“分组依据”子查询 我正试图通过将此额外数据作为[NotMapped]字段添加到实体来添加它: [NotMapped] public string NotMappedField { get; set; } 所以我基本上想替换这个webapi控制器方法 [HttpGet] public IQueryable<MyObject> MyObjec
[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;
}
var query = breeze.EntityQuery
.from("MyObjectsWithExtraData")
.where("theObject.FieldA", "Equals", 1)
.expand("theObject.SomeNavigationalProperty")
.orderBy("theObject.FieldB");
仍然不完全是我想要的,但它实际上非常灵活。看看EntityQuery.withParameters方法
// client side
var q = EntityQuery.from("CustomersStartingWith")
.withParameters({ companyName: "C" });
// server side
[HttpGet]
public IQueryable<Customer> CustomersStartingWith(string companyName) {
var custs = ContextProvider.Context.Customers.Where(c => c.CompanyName.StartsWith(companyName));
return custs;
}
//客户端
var q=EntityQuery.from(“CustomerStartingWith”)
.withParameters({companyName:“C”});
//服务器端
[HttpGet]
公共IQueryable CustomerStartingWith(字符串公司名称){
var custs=ContextProvider.Context.Customers.Where(c=>c.CompanyName.StartsWith(CompanyName));
归还客户;
}
您还可以将常规查询谓词的组合与这些自定义参数进行混合和匹配。LINQ to entity只能构造pur“Data Transfert Object”:只包含公共属性的类,该类带有普通的getter和setter,没有构造函数。 请参见我对类似问题的回答: 我指定我的答案 实体类不能在LINQ to Entities查询中实例化。 如果要在查询中构造相似(或几乎相似),则必须定义其他类。 在您的例子中,您希望返回几乎与
MyObject
相似的对象。因此,您必须定义一个类:
public class MyObjectExtended
{
public string FieldA { get; set; }
public string FieldB { get; set; }
// ... all other MyObjetc fields
public string ExtraFieldA { get; set; }
public string ExtraFieldB { get; set; }
}
现在,您的服务可以返回一个IQueryable
:
extradata()的公共可查询MyObject{
var myQuery=来自_contextProvider.Context.MyObjects中的o
//大而复杂的查询。。。。
选择新的MyObjectExtended{
FieldA=o.FieldA,
FieldB=o.FieldB,
//……所有领域。。。
ExtraFieldA=x.ResultFromComplexJoinA,
ExtraFieldB=x.ResultFromComplexJoinB
};
返回myQuery;
}
我希望这就是您想要的。谢谢Jay,我不是真的想传递参数,而是想返回额外的数据。也许我可以这样做-返回新的{MyOjbect,extraField}并通过数据访问它。。。它只是似乎更好地将其作为实体上的未映射字段(它只是一个额外的文本字段)供参考-我修改了问题,希望能更清楚地提出问题如果另一个问题的答案解决了这个问题,那么这个问题应该作为该问题的副本关闭。请相应地标记该问题。为什么不在HTTPResponse中返回额外的数据,然后在完成查询后获取这些数据?通过将参数传递到.then(函数(数据){console.log(data.httpResponse);}来访问它
public class MyObjectExtended
{
public string FieldA { get; set; }
public string FieldB { get; set; }
// ... all other MyObjetc fields
public string ExtraFieldA { get; set; }
public string ExtraFieldB { get; set; }
}
public IQueryable<MyObjectExtended> MyObjectsWithExtraData() {
var myQuery = from o in _contextProvider.Context.MyObjects
// big complex query....
select new MyObjectExtended {
FieldA = o.FieldA,
FieldB = o.FieldB,
//... all fields ...
ExtraFieldA = x.ResultFromComplexJoinA,
ExtraFieldB = x.ResultFromComplexJoinB
};
return myQuery;
}