使用实体框架时是不是可以从查询中返回字符串值?

Posted

技术标签:

【中文标题】使用实体框架时是不是可以从查询中返回字符串值?【英文标题】:Is it possible to return string values from a query when using Entity-Framework?使用实体框架时是否可以从查询中返回字符串值? 【发布时间】:2016-09-17 14:10:34 【问题描述】:

到目前为止,我知道两种查询数据库的方法。其中之一是使用 mysql 的库;通过声明“MySqlCommand”、“MySqlDataReader”、“MySqlConnection”并利用内置方法。

另一个是通过使用实体框架(这是我的首选)。

但是,我在使用后一种方法时遇到了一些问题。我个人责怪我缺乏知识。似乎在向最终用户传送数据时,Entity-Framework 倾向于 ObservableCollection 或 List。

对我来说,这意味着在视图中,我将使用 Datagrid 或 List 控件。一般这样就好了。

但是,如果我不想在混合中使用 datagrid 控件会发生什么?如果我想在文本框中传达查询的结果怎么办?如何在不牺牲实体框架的使用的情况下执行以下操作?有没有可能?

        string config = "server=localhost; userid = root; database = databaseName";
        MySqlConnection con = new MySqlConnection(config);

        MySqlDataReader reader = null;

        // Run the select query
        string query = "SELECT * FROM students WHERE id = " +id;

        MySqlCommand command = new MySqlCommand(query, con);
        con.Open();
        reader = command.ExecuteReader();

        while (reader.Read())
        
            // Put the results in the appropriate strings so I can databind them
            string studentName = (string)reader["studentName"];

            string studentNum = (string)reader["studentNum"];

            .....
        
        con.Close();

我怎样才能利用实体框架做到这一点?

【问题讨论】:

您可以使用 SingleOrDefault() 而不是 ToList() 或简单地遍历您的 List 结果并将值添加到关联的文本框。 【参考方案1】:

此 SQL 查询的 EF 等效项:

// note, that this leads to SQL injections,
// use parametrized queries instead!
"SELECT * FROM students WHERE id = " +id

将是:

var student = context.Students.Find(id) // this will lookup local data as well

或:

var student = context.Students.Single(_ => _.Id == id)

两者都将返回单个 Student 实例,而不是序列/集合,您可以将 UI 绑定到其属性或照常访问它们:

student.StudentName

【讨论】:

好的。这就说得通了。只是一个小细节。我如何访问这些我需要绑定的属性?我知道查询是如何完成的,我看到了context.Students,但是我如何找到(例如)context.students 中的StudentName 字段?我的意思是在这一切结束时,我仍然需要将值放在字符串或 int 中,对吗? @Offer:我已经更新了答案。像往常一样调用属性。 就这样。非常感谢。【参考方案2】:

尝试这样的事情:

public static Studens GetStudent(int id)
    
    return context.Studens.SingleOrDefault(x=>x.Id == id);

【讨论】:

不要做.Any 然后.First - 只做.SingleOrDefault() 为什么不return context.Studens.SingleOrDefault(x=>x.Id == id); @MantasČekanauskas 谢谢。我已根据您的建议修改了答案。

以上是关于使用实体框架时是不是可以从查询中返回字符串值?的主要内容,如果未能解决你的问题,请参考以下文章

在实体框架中使用更新数据库时子查询返回超过 1 个值错误

实体框架忽略架构

提供者未返回 ProviderManifestToken 字符串实体框架

查询的结果从实体框架查询返回相同的 COLUMN_NAME 值,这没有意义

如何从 DBContext(实体框架核心)中的 App.config(不是 .net 核心应用程序)读取值

使用 concat() 时 JPA 本机查询返回字节数组而不是字符串