gpt4 book ai didi

c# - Group join 导致 IQueryable 变成 IEnumerable,为什么?

转载 作者:太空狗 更新时间:2023-10-29 20:40:21 25 4
gpt4 key购买 nike

我正在访问远程数据源,发现组连接导致 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) => new QuoteDTO

  1. _abilities是一个IQueryable,我获取一个用户的能力,对象的集合
  2. 第二部分 (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<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 查询中存储新对象。抱歉,我之前错过了这一点。

关于c# - Group join 导致 IQueryable 变成 IEnumerable,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7838304/

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