在EF中执行Sql语句。
using (var context = new EFRecipesEntities()) { string sql = @"insert into Chapter3.Payment(Amount, Vendor) values (@Amount, @Vendor)"; var args = new DbParameter[] { new SqlParameter { ParameterName = "Amount", Value = 99.97M}, new SqlParameter { ParameterName = "Vendor", Value="Ace Plumbing"} }; int rowCount = context.ExecuteStoreCommand(sql, args); }
using (var context = new EFRecipesEntities()) { string sql = "select * from Chapter3.Student where Degree = @Major"; var args = new DbParameter[] { new SqlParameter {ParameterName = "Major", Value = "Masters"}}; var students = context.ExecuteStoreQuery<Student>(sql, args); Console.WriteLine("Students..."); foreach (var student in students) { Console.WriteLine("{0} {1} is working on a {2} degree", student.FirstName, student.LastName, student.Degree); } }
using (var conn = new EntityConnection("name=EFRecipesEntities")) { var cmd = conn.CreateCommand(); conn.Open(); cmd.CommandText = @"select c.Name, C.Email from EFRecipesEntities.Customers as c"; using (var reader = cmd.ExecuteReader(CommandBehavior.SequentialAccess)) { while (reader.Read()) { Console.WriteLine("{0}'s email is: {1}", reader.GetString(0), reader.GetString(1)); } } }
1.sql = "select * from Payment where Vendor= @vendor";之所以能写成select *是因为Payment对象的属性和表的字段命名完全一致,如果不一致的话,需要将表字段取别名,别名需是对象映射的属性名称。
2.如果sql语句返回的列少于(具体化)实体的属性的个数,那么EF在具体化的时候将抛出一个异常如下图,因此将需要缺少的列补上一些没有意义的值,以保证在具体乎的时候不会报错:eg 如图1,如果sql=”select PaymentId ,Amount from Payment ” 这样使用context.ExecuteStoreQuery<Payment >(sql, args);那么会报异常,因此需要将Vendor 列补上 。正确的sql=”select PaymentId ,Amount, null as Vendor from Payment”。
3.如果sql 返回的列 多余具体化的实体属性的个数,那么EF将会忽视多出的列。