C# 使用实体框架核心获取动态列

C# 使用实体框架核心获取动态列,c#,linq,entity-framework-core,C#,Linq,Entity Framework Core,我正在使用一个存储库模式,该模式返回带有Entity Framework Core 2的IEnumerables,并希望实现一个get方法,该方法接受以逗号分隔的列名字符串,并返回仅包含这些列的实体列表。我想限制来自DB的数据量(很好),但更重要的是,我需要限制从RESTAPI到浏览器的数据量 看起来nuget包EntityFramework.dynamicLink是一个不错的选择。正如我从网站上的文档中所看到的那样 我应该能够做到这一点: using EntityFramework.Dynam

我正在使用一个存储库模式,该模式返回带有Entity Framework Core 2的IEnumerables,并希望实现一个get方法,该方法接受以逗号分隔的列名字符串,并返回仅包含这些列的实体列表。我想限制来自DB的数据量(很好),但更重要的是,我需要限制从RESTAPI到浏览器的数据量

看起来nuget包EntityFramework.dynamicLink是一个不错的选择。正如我从网站上的文档中所看到的那样

我应该能够做到这一点:

using EntityFramework.DynamicLinq

public class CompanyRepository
{
    public async Task<IEnumerable<Company>> Get(string columns)
    {
    return await _dbSet.AsNoTracking().Select("new(" + columns + ")").ToListAsync();
    }
}
使用EntityFramework.DynamicLink
公共类公司储蓄
{
公共异步任务获取(字符串列)
{
return await_dbSet.AsNoTracking().选择(“新建(“+columns+”)).toListSync();
}
}
很遗憾,Select调用会出现以下错误:

无法从用法推断方法
可枚举.Select(IEnumerable,Func)
的类型参数


我想出来了。我导入了错误的命名空间,Select必须包含对象类型:

using System.Linq.Dynamic.Core;

public class CompanyRepository
{
    public async Task<IEnumerable<Company>> Get(string columns)
    {
    return await _dbSet.AsNoTracking().Select<Company>("new(" + columns + ")").ToListAsync();
    }
}
使用System.Linq.Dynamic.Core;
公共类公司储蓄
{
公共异步任务获取(字符串列)
{
return await_dbSet.AsNoTracking().选择(“新建(“+columns+”)).toListSync();
}
}

我想出来了。我导入了错误的命名空间,Select必须包含对象类型:

using System.Linq.Dynamic.Core;

public class CompanyRepository
{
    public async Task<IEnumerable<Company>> Get(string columns)
    {
    return await _dbSet.AsNoTracking().Select<Company>("new(" + columns + ")").ToListAsync();
    }
}
使用System.Linq.Dynamic.Core;
公共类公司储蓄
{
公共异步任务获取(字符串列)
{
return await_dbSet.AsNoTracking().选择(“新建(“+columns+”)).toListSync();
}
}

试试这个。公共异步任务Get(string columns){return await_dbSet.AsNoTracking().Select(“new”(“+columns+”)).ToListAsync();}@GaurangDave认为行给出了以下错误:“IQueryable”不包含“Select”的定义,并且找不到接受“IQueryable”类型的第一个参数的扩展方法“Select”。这是我使用的动态列函数之一。如果“Id”对您没有用处,您可以避免使用。否则,此函数将返回动态列的值。你可以根据需要修改它,并让我知道。public int GetIntVal(string ColumnName,int Id){var repo=repo.Entities.Where(x=>x.Id==Id).选择(e=>e).FirstOrDefault();if(repo==null)返回0;var value=repo.GetType().GetProperties().Where(a=>a.Name==ColumnName).选择(p=>p.GetValue(repo,null)).FirstOrDefault();返回值!=null?Convert.ToInt32(value.ToString()):0;}@GaurangDave。谢谢你的帮助。我找到了答案。我会将它作为答案发布尝试这个。公共异步任务Get(string columns){return await{u dbSet.AsNoTracking()。选择(“new(“+columns+”))。toListSync()}@GaurangDave认为行给出了以下错误:“IQueryable”不包含“Select”的定义,并且找不到接受“IQueryable”类型的第一个参数的扩展方法“Select”。这是我对动态列使用的函数之一。可以避免使用“Id”如果对您不有用。否则此函数返回动态列的值。您可以根据需要修改它并告诉我。public int GetIntVal(string ColumnName,int Id){var repo=repo.Entities.Where(x=>x.Id==Id)。选择(e=>e)。FirstOrDefault();if(repo==null)返回0;var value=repo.GetType().GetProperties().Where(a=>a.Name==ColumnName)。选择(p=>p.GetValue(repo,null)).FirstOrDefault();返回值!=null?Convert.ToInt32(value.ToString()):0;}@GaurangDave。谢谢你的帮助。我找到了答案。我会把它作为答案发布的