Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用IQueryable方法返回额外数据?_C#_Linq_Entity Framework_Breeze - Fatal编程技术网

C# 如何使用IQueryable方法返回额外数据?

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

我正在使用实体框架和Breeze。对于一个实体,我想为该实体提供一些相关数据。通过查询实体表并连接到其他表,可以最有效地获取这些数据;此查询包括“分组依据”子查询

我正试图通过将此额外数据作为[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;
}
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;
}