c# - Entity Framework Core 返回一些选择

标签 c# entity-framework .net-core entity-framework-core

如何从 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/

相关文章:

c# - 我可以将 sqlite 与 mySQL 备份文件一起使用吗?

c# - EF 延迟加载 : Add item to navigation property without loading it

asp.net-mvc - 将身份从字符串更改为 int 后无法在 Seed 方法上添加新角色

entity-framework - 如何首先在 Entity Framework Core 2.0 代码中按类型继承创建表?

.net-core - .Net Core 的 DotNetOpenAuth 功能

c# - 如何在 .net core 中读取无键查询字符串

c# - 调用 Web 服务异步

c# - This.controls.find()[0] 错误 : Index was outside the bound of array

c# - Azure 表存储查询性能缓慢

iis - 使用url重写将子域从一个域重定向到iis中另一个域的子域