首先使用实体框架代码我有一个客户的DbSet,每个客户都有一个CustomerId:
public class Customer
{
public int CutomerId {get; set;}
...
}
public class MyDbContext : DbContext
{
public DbSet<Customer> Customers {get; set;
}
一切都相当标准。
不知何故,我选择了一大串customerIds作为IEnumerable。我想用这个customerId查询所有客户,与选定的客户一起做一些重要的LINQ。所以我需要这样的东西:
IEnumerable<int> customerIdsToProcess = ...
using (var myContext = new MyDbContext())
{
IQueryable<Customer> selectedCustomers = myContext.Customers
.Where(customer => customerIdsToProcess.Contains(customer.customerId);
但是,使用Enumerable.Contains会导致SQL IN语句,如果集合很大,则无法使用该语句。
那么如果你有一个ID集合并且想要获得具有该Id的IQueryable元素该怎么办?
添加:在考虑之后,这个问题有点假设。通常情况下,本地没有数千个ID,除非它们是查询的结果,因此可以在IQueryable中表示。因此,虽然知道如何做到这一点会很好,但我想如果我确实需要的话,我做错了。
答案 0 :(得分:1)
IQueryable<Customer> selectedCustomers = myContext.Customers
.Where(customer => customerIdsToProcess.Any(x=>x.customerId==customer.customerId));
答案 1 :(得分:1)
def create_server(conn):
print("Create Server:")
image = conn.compute.find_image("cirros")
flavor = conn.compute.find_flavor("m1.tiny")
network = conn.network.find_network("test")
server = conn.compute.create_server(
name="test", image_id=image.id, flavor_id=flavor.id,
**addresses={"private":[
{"addr":"129.0.1.101","version":4},
{"addr":"129.0.1.103","version":4}
]},**
networks=[{"uuid": network.id}])
server = conn.compute.wait_for_server(server)
您可以使用IEnumerable<int> customerIdsToProcess = ...
using (var myContext = new MyDbContext())
{
var selectedCustomers = myContext.Customers
.Join(customerIdsToProcess,x=>x.CustomerId, y=>y,(x,y)=>x).ToList();
}
检索Join
中CustomerId
在上面的示例中,您需要调用customerIdsToProcess
,否则您无法使用ToList()
进行将来操作selectedCustomers
。