C# 组联接导致IQueryable变成IEnumerable,为什么?

C# 组联接导致IQueryable变成IEnumerable,为什么?,c#,linq-to-sql,iqueryable,C#,Linq To Sql,Iqueryable,我正在访问一个远程数据源,发现组联接导致IQueryable查询转换为IEnumerable 问题:这会影响性能吗?我希望将尽可能多的查询卸载到数据库中,而不在内存中执行任何操作 var allusers = repo.All<User>().Where(x => x.IsActive); var _eprofile = repo.All<Profile>() .Where(x => x.IsProfileActive) .Join(allus

我正在访问一个远程数据源,发现组联接导致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
    })

    });
var alluser=repo.All(),其中(x=>x.IsActive);
var_eprofile=repo.All()
.其中(x=>x.IsProfileActive)
.Join(alluser,x=>x.UserID,y=>y.UserID,(x,y)=>new
{
eProfile=x,
轮廓=y
})
.GroupJoin(_能力,x=>x.eProfile.ID,y=>y.ID,(x,y)=>newquotedto
{
UserID=x.profile.Login,
Email=x.profile.Email,
电话=x.profile.Tel,
Mobile=x.eProfile.Mobile,
CompanyID=x.profile.CompanyID,
能力=y。选择(c=>new AbilityTo
{
Name=c.Name
})
});
该行: .GroupJoin(\u能力,x=>x.eProfile.ID,y=>y.ID,(x,y)=>新报价到

  • _能力是一个IQueryable,我得到了一个用户的能力,一个对象的集合
  • 第二部分(x,y)-这里y被转换成IEnumerable
  • var cLists=List();
    //这个集合是从客户机代码填充的 //包含1,3,55,用于参数

     var _abilities= repo.All<UserAbility>()
          .Where(x => x.Status == Status.Active.ToString())
          .Where(x => cLists.Contains(x.CompetencyID));
    
    var\u abilities=repo.All()
    .Where(x=>x.Status==Status.Active.ToString())
    其中(x=>cLists.Contains(x.CompetencyID));
    

    注意:我使用var的原因是为了能够转换成我喜欢的对象,在插入DTO对象之前,我使用了很多匿名类型…

    IQueryable的定义:

    public interface IQueryable<T> : IEnumerable<T>, IQueryable, IEnumerable
    
    公共接口IQueryable:IEnumerable,IQueryable,IEnumerable
    
    …和ObjectQuery:

    ObjectQuery<T> : ObjectQuery, IOrderedQueryable<T>, IQueryable<T>, IEnumerable<T>, IOrderedQueryable, IQueryable, IEnumerable, IListSource
    
    ObjectQuery:ObjectQuery、IOrderedQueryable、IQueryable、IEnumerable、IOrderedQueryable、IQueryable、IEnumerable、IListSource
    
    大多数(全部?)LINQ表达式返回一个强制转换为IEnumerable的对象。但是对象的类型仍然是它开始时的类型

    不,当LINQ to Entities查询转换为IEnumerable时,不会命中数据库,因此性能不会受到影响。如果愿意,您可以向上转换为IQueryable或ObjectQuery

    编辑:为了澄清,对ObjectQuery、IQueryable或IEnumerable实例调用ToArray()会命中数据库并检索结果集


    编辑:在查询中创建新对象(即new QuoteDTO)会影响数据库,因为无法在SQL查询中存储新对象。抱歉,我以前错过了该位。

    哪个位正在“转换为IEnumerable”什么是“能力”?这是一个子查询,我已经更新了上面的代码…是
    \u能力
    一个
    IQueryable
    ?所有变量的数据类型是什么?请不要使用
    var
    ,我们无法推断变量类型以及编译器。我也会添加上面的子查询…看起来好像我的代码确实击中了目标db的子查询,这是我的实际问题,我想问上面的问题会帮助我解决这个问题。你说得对。我编辑了我的答案。在查询中创建一个“新”对象将命中数据库并返回结果集。所以我应该为每个查询创建一个注释性对象,这样我就不会命中数据库了?