如何从 EF Core(SQL Server 数据库)返回少量选择?
我尝试了下一个示例,但出现错误:
No mapping to a relational type can be found for the CLR type 'Test1'
此行发生错误:
var valueBufferFactory = set
.GetService<IRelationalValueBufferFactoryFactory>()
.Create(new[] { typeof(T) }, null);
相关代码如下:
public void Test()
{
using (var cnn = _context.Database.GetDbConnection())
{
var cmm = cnn.CreateCommand();
cmm.CommandType = System.Data.CommandType.Text;
cmm.CommandText = "select id, name, code from dbo.Test1; select id, name, singleChoice from dbo.Test2";
cmm.Connection = cnn;
cnn.Open();
using (var reader = cmm.ExecuteReader())
{
var answers = _context.Test1.Translate(reader);
reader.NextResult();
var questions = _context.Test2.Translate(reader);
}
}
}
public static List<T> Translate<T>(this DbSet<T> set, DbDataReader reader) where T : class
{
var entityList = new List<T>();
if (reader == null || reader.HasRows == false) return entityList;
var entityType = set.GetService<Microsoft.EntityFrameworkCore.Metadata.IModel>().FindEntityType(typeof(T));
var valueBufferParameter = Expression.Parameter(typeof(ValueBuffer));
var entityMaterializerSource = set.GetService<IEntityMaterializerSource>();
var valueBufferFactory = set.GetService<IRelationalValueBufferFactoryFactory>().Create(new[] { typeof(T) }, null);
var stateManager = set.GetService<IStateManager>() as StateManager;
Func<ValueBuffer, T> materializer = Expression
.Lambda<Func<ValueBuffer, T>>(entityMaterializerSource.CreateMaterializeExpression(entityType, valueBufferParameter), valueBufferParameter)
.Compile();
stateManager.BeginTrackingQuery();
while (reader.Read())
{
ValueBuffer valueBuffer = valueBufferFactory.Create(reader);
var entity = materializer.Invoke(valueBuffer);
var entry = stateManager.StartTrackingFromQuery(entityType, entity, valueBuffer, null);
entityList.Add((T)entry.Entity);
}
return entityList;
}
最佳答案
您正在使用大量 EF Core 内部内容,因此请记住,此代码的任何部分都可能(并且可能会)在未来的 EF Core 版本中中断(即使现在我收到警告 Create
使用的方法已过时)。
无论如何,现在的问题是 Create
的第一个参数 - 您正在传递 new[] { typeof(T) }
(实体),同时它期望一个包含要从读取器映射的属性的 CLR 类型的数组。
因此以下应该有效:
var valueBufferFactory = set.GetService<IRelationalValueBufferFactoryFactory>()
.Create(entityType.GetProperties().Select(p => p.ClrType).ToArray(), null);
关于c# - Entity Framework Core 返回一些选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53554089/