gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:59:25 26 4
gpt4 key购买 nike

我正在使用 Entity Framework 和 Breeze。对于实体,我想为该实体提供一些关联数据。通过查询实体表并连接到其他表来最有效地获取此数据;此查询包括一个分组查询子查询。

我试图通过将其作为 [NotMapped] 字段添加到实体来添加这些额外数据:

[NotMapped]
public string NotMappedField { get; set; }

所以我基本上想替换这个 webapi Controller 方法

[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;
}

这给了我一个错误:

The entity or complex type 'MyObject' cannot be constructed in a LINQ to Entities query.

我已经尝试了几种方法,它似乎从 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;
}

然后从客户端 Breeze 方面你可以做这样的事情:

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;
}

您还可以将常规查询谓词与这些自定义参数混合搭配。

关于c# - 如何使用 IQueryable 方法返回额外数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052403/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com