猿教程 Logo

使用EDM 查询

我们在前面的教程部分创建了EDM、DbContext和实体类。

在这里,您将学习实体框架所支持的不同类型的查询方式,这些查询方式都是转换为SQL语句来查询底层的数据库。

实体框架支持三种类型的查询:1)LINQ to Entities,2)Entity SQL,3)原生SQL


LINQ to Entities查询

LINQ,语言集成查询(Language Integrated Query)是一种强大的查询语言,是在Visual Studio 2008中引入的。 您可以使用LINQ在c#或Visual Basic中做不同数据源的查询。 LINQ-to-Entities作用于实体框架的实体访问底层数据库的数据。 您可以使用LINQ方法查询数据。 访问 LINQ教程 查看更多Linq学习资料。

基于方法查询:

//使用Linq to Entities查询
using (var context = new SchoolDBEntities())
{
    var L2EQuery = context.Students.where(s => s.StudentName == "Bill");
        
    var student = L2EQuery.FirstOrDefault<Student>();
}

使用Linq表达式查询:


using (var context = new SchoolDBEntities())
{
    var L2EQuery = from st in context.Students
                    where st.StudentName == "Bill"
                    select st;
   
    var student = L2EQuery.FirstOrDefault<Student>();
}

首先,您必须创建一个上下文类的对象,示例中是SchoolDBEntities。

你应该使用using()来初始化,这样一旦超出范围就会自动调用Dispose()方法来回收资源。

在上面的两种语法中,上下文返回一个继承于IQueryable的类的对象。


Entity SQL查询

Entity SQL 是 ADO.NET 实体框架 提供的 SQL 类语言,用于支持 实体数据模型 (EDM)。Entity SQL 可用于对象查询和使用 EntityClient 提供程序执行的查询。

你需要使用ObjectContext创建一个使用实体SQL的查询对象。

下面的代码片段显示了Entity SQL示例:

//Querying with Object Services and Entity SQL
string sqlString = "SELECT VALUE st FROM SchoolDBEntities.Students " +
                    "AS st WHERE st.StudentName == 'Bill'";
    
var objctx = (ctx as IObjectContextAdapter).ObjectContext;
                
ObjectQuery<Student> student = objctx.CreateQuery<Student>(sqlString);
                Student newStudent = student.First<Student>();

您还可以使用EntityConnection和EntityCommand来执行实体SQL,如下所示:

using (var con = new EntityConnection("name=SchoolDBEntities"))
{
    con.Open();
    EntityCommand cmd = con.CreateCommand();
    cmd.CommandText = "SELECT VALUE st FROM SchoolDBEntities.Students as st where st.StudentName='Bill'";
    Dictionary<int, string> dict = new Dictionary<int, string>();
    using (EntityDataReader rdr = cmd.ExecuteReader(CommandBehavior.SequentialAccess | CommandBehavior.CloseConnection))
    {
            while (rdr.Read())
            {
                int a = rdr.GetInt32(0);
                var b = rdr.GetString(1);
                dict.Add(a, b);
            }
    }               
}

EntityDataReader并不会返回ObjectQuery,相反,它返回数据行。



原生 SQL查询

您可以执行本地SQL来查询关系数据库,如下所示:

using (var ctx = new SchoolDBEntities())
{
    var studentName = ctx.Students.SqlQuery("Select studentid, studentname, standardId from Student where studentname='Bill'").FirstOrDefault<Student>();
}

以上案例是使用原生SQL来执行查询操作。


版权声明:本站所有教程均为本站原创或翻译,转载请注明出处,请尊重他人劳动果实。请记住本站地址:www.yuanjiaocheng.net (猿教程) 作者:卿文刚
本文标题: C#环境
本文地址:http://www.yuanjiaocheng.net/entity/query-with-edm.html