【发布时间】:2019-02-06 08:41:21
【问题描述】:
我有一个DbContext,我想在其中运行查询以仅返回特定列,以避免获取所有数据。
问题是我想用一组字符串指定列名,我想获得一个原始类型的IQueryable,即不构造匿名类型。
这是一个例子:
// Install-Package Microsoft.AspNetCore.All
// Install-Package Microsoft.EntityFrameworkCore
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
public class Person {
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class TestContext : DbContext {
public virtual DbSet<Person> Persons { get; set; }
public TestContext(DbContextOptions<TestContext> options) : base(options) {
}
}
class Program {
static void Main(string[] args) {
var builder = new DbContextOptionsBuilder<TestContext>();
builder.UseInMemoryDatabase(Guid.NewGuid().ToString());
var context = new TestContext(builder.Options);
context.Persons.Add(new Person { FirstName = "John", LastName = "Doe" });
context.SaveChanges();
// How can I express this selecting columns with a set of strings?
IQueryable<Person> query = from p in context.Persons select new Person { FirstName = p.FirstName };
}
}
我想要这样的方法:
static IQueryable<Person> GetPersons(TestContext context, params string[] fieldsToSelect) {
// ...
}
有什么办法可以做到吗?
【问题讨论】:
-
使用反射。它会变得丑陋和混乱,并且会降低性能,但除了将每个属性映射到字符串之外,这可能是唯一的方法。
-
即使使用反射,我如何创建选择语句?我要避免的是从数据库中获取所有数据。
-
使用原始 sql 然后映射到您自己的 DTO。我们过去就是这样做的。 docs.microsoft.com/en-us/ef/core/querying/raw-sql
-
我很确定你可以做到这一点,谷歌搜索“Dynamic Linq”这可能会让你走上正确的轨道,也看看这个答案stackoverflow.com/questions/16516971/linq-dynamic-select
标签: c# .net-core entity-framework-core