组连接导致IQueryable变成IEnumerable,为什么?
本文关键字:IEnumerable 为什么 变成 IQueryable 连接 | 更新日期: 2023-09-27 18:11:45
我正在访问远程数据源,发现组连接导致IQueryable查询转换为IEnumerable,
问题:这会影响性能吗?我想卸载尽可能多的查询到数据库,而不是在内存中执行任何东西…
var allusers = repo.All<User>().Where(x => x.IsActive);
var _eprofile = repo.All<Profile>()
.Where(x => x.IsProfileActive)
.Join(allusers, x => x.UserID, y => y.UserID, (x, y) => new
{
eProfile = x,
profile = y
})
.GroupJoin(_abilities, x => x.eProfile.ID, y => y.ID, (x, y) => new QuoteDTO
{
UserID = x.profile.Login,
Email = x.profile.Email,
Tel = x.profile.Tel,
Mobile = x.eProfile.Mobile,
CompanyID = x.profile.CompanyID,
Ability = y.Select(c => new AbilityDTO
{
Name= c.Name
})
});
:. groupjoin (_abilities, x => x. eprofile。ID, y => y.ID, (x, y) =>新QuoteDTO
- _abilities是一个IQueryable,我得到一个用户的能力,一个对象的集合
- 第二部分(x,y) -这里y被转换成IEnumerable…
var cLists = List<int>();
//这个集合是由客户端代码填充的//包含1、3、55个参数…
var _abilities= repo.All<UserAbility>()
.Where(x => x.Status == Status.Active.ToString())
.Where(x => cLists.Contains(x.CompetencyID));
注意:我使用var的原因是我可以转换成我喜欢的对象,在插入DTO对象之前,我使用了很多匿名类型…
IQueryable定义:
public interface IQueryable<T> : IEnumerable<T>, IQueryable, IEnumerable
…和ObjectQuery:
ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>, IQueryable<T>, IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable, IListSource
最(?)LINQ表达式返回一个转换为IEnumerable的对象。但是对象的类型仍然是它开始时的类型。
不,当LINQ-to-Entities查询被强制转换为IEnumerable时,数据库不会受到影响,因此性能不会受到影响。如果你愿意,你可以向上转换为IQueryable或ObjectQuery。
编辑:澄清一下,在ObjectQuery、IQueryable或IEnumerable的实例上调用ToArray()确实会访问数据库并检索结果集。
编辑:在查询中创建一个新对象(即新的QuoteDTO)将击中数据库,因为没有办法在SQL查询中存储新对象。对不起,我刚才漏掉了。