2014-02-21 44 views
0

我正在使用IDbSet结果集并尝试使用LinQ构造“IN”类型子句。 我的代码如下:需要铸造的IEnumerable Linq的IDbSet?

public IDbSet<User> Users { get; set; } 

public IDbSet<User> GetUsers(params int[] IDs) 
{ 
    return from u in Users 
      where IDs.Contains(u.Id) 
      select u; 
} 

的编译器不喜欢它指出:
无法隐式转换类型“System.Linq.IQueryable”到“System.Data.Entity.IDbSet”。存在明确的转换(您是否缺少演员?)

我已经尝试了通常的演员表并将其作为(ing)。但我似乎无法让编译器接受这一点。 我在这里错了吗?

回答

2

您不应该将查询结果作为IDbSet<T>返回。

一种IDbSet表示集合中的所有实体的在上下文中,或可以从该数据库中查询给定类型的。 DbSetIDbSet的具体实现。

MSDN

你正在试图获得实体的唯一子集。这就是IQueryable<T>/IEnuemerable<T>。更改方法声明返回IQueryable<User>

public IQueryable<User> GetUsers(params int[] IDs) 
{ 
    return from u in Users 
      where IDs.Contains(u.Id) 
      select u; 
} 

差异与IEnuemerable<T>之间IQueryable<T>是,当你返回IEnumerable<T>每下一个LINQ查询在该实例上设置将被执行的LINQ到对象,所以你的SQL不会受到影响:

var items = GetUsers().Select(x => x.SomeColumnName); 

这一次仍然会带来从Users表中的所有列到内存和项目他们作为LINQ到对象查询。

使用返回IQueryable<T>的方法,相同的代码会影响生成的SQL的外观:只有一列中的数据将从数据库中提取。