C# 为什么EntityFramework原始SqlQuery从MySql返回具有不需要的值的对象?

C# 为什么EntityFramework原始SqlQuery从MySql返回具有不需要的值的对象?,c#,mysql,entity-framework-6,mysql-connector,C#,Mysql,Entity Framework 6,Mysql Connector,当我对DBContext运行RawSqlQuery以从MySql数据库获取对象列表时,这些对象并没有返回其在数据库中的实际值。查询后,列表中的所有对象都具有所有属性的默认值 代码: 检索到的结果: 原始数据: idcall,starttime 1, '2017-12-01 22:56:38' 2, '2017-12-01 22:56:33' 3, '2017-12-01 22:56:44' 4, '2017-12-01 22:56:14' 5, '2017-12-01 22:5

当我对DBContext运行RawSqlQuery以从MySql数据库获取对象列表时,这些对象并没有返回其在数据库中的实际值。查询后,列表中的所有对象都具有所有属性的默认值

代码:

检索到的结果:

原始数据: idcall,starttime 1, '2017-12-01 22:56:38' 2, '2017-12-01 22:56:33' 3, '2017-12-01 22:56:44' 4, '2017-12-01 22:56:14' 5, '2017-12-01 22:56:49' 6, '2017-12-01 22:56:34' 7, '2017-12-01 22:56:41' 8, '2017-12-01 22:56:25' 9,'2017-12-01 22:56:39'

根据EF文件,我试图实现的目标应该是可能的。

从链接:

可以使用数据库类上的SqlQuery方法创建返回任何类型(包括基元类型)的实例的SQL查询。 例如:使用var context=newbloggingcontext{ var blogNames=context.Database.SqlQuery 从dbo.Blogs.ToList;}中选择名称

我使用的是EntityFramework 6.1.3和C,MySql 5.6 for windows,connector.net 6.9.8。我将EF更新为6.2.0最新版本,但这并没有解决问题


非常感谢您的帮助。

键值对类型不正确。它与属性名匹配。您应该改用自定义类型。例如:

编辑:更改类型以匹配您的用例

public class MyDto
{
    public int IdCall { get; set; }
    public DateTime StartTime { get; set; }
}
然后您的查询将如下所示:

var rowIdVsDates = dbContext.Database.SqlQuery<MyDto>(sql).ToList();

根据我的经验,用于.net的MySQL连接器一直是非常值得怀疑的。最终我发现有必要离开他们。我建议使用SqlProvider将其连接到一个测试MSSQL数据库,并查看是否生成了正确的数据集。如果是,那么MySQL连接器中就有一个bug,而不是实体框架。是的,MySQL连接器似乎有很多bug。我只使用原始sql选项no ef您的问题是KeyValuePair不能与SqlQuery一起使用-请参阅;您应该创建自己的类或返回ValueTuple?并使用LINQ Select将其转换为KeyValuePair-您还需要与列名匹配的属性设置器。我接受这一答案,但原始Sql查询中的列名必须与类myDto的属性名匹配,因此,如果需要,应在Sql中使用列别名,如本例中所示:字符串Sql=$@select idcall as idcall,starttime as starttime from cdr limit 0100;经过测试,一切正常。
var rowIdVsDates = dbContext.Database.SqlQuery<MyDto>(sql).ToList();