2016-03-06 49 views
0

我想用LINQ替换我的原始SQL。这里是我的代码:如何从原始SQL重写为LINQ?

myController的:

 using MyProject.Models; 
     using System.Collections.Generic; 
     using System.Linq; 
     using System.Web.Http; 

     namespace MyProject.Controllers 
     { 
      public class MyController : ApiController 
      { 
       [HttpGet] 
       public List<User> UserData() 
       { 
        var selUserData = "SELECT * FROM mydb.User"; 

        using (var ctx = new ApplicationDbContext()) 
        { 
         var userData = ctx.Database.SqlQuery<User>(selUserData).ToList(); 

         return userData;       
        } 
       } 

       public class User 
       { 
        public int Id { get; set; } 
        public string Username { get; set; } 
        public string Password { get; set; } 
       } 
      } 
     } 

Web.config文件:

<connectionStrings> 
    <add name="MyEntities" providerName="MySql.Data.MySqlClient" connectionString="server=127.0.0.1;port=3306;database=,mydb;uid=root;password=mypass" /> 
</connectionStrings> 

ApplicationDBContext.cs:

using MySql.Data.Entity; 
    using System.Data.Entity; 

    namespace MyProject.Models 
    { 
     [DbConfigurationType(typeof(MySqlEFConfiguration))] 
     public class ApplicationDbContext : DbContext 
     { 
      public ApplicationDbContext() : base(nameOrConnectionString: "MyEntities") { } 
     } 
    } 

我一直在寻找一些日子网页尝试找到一个解决方案,但没有运气。我的代码应该看起来像var userData = ctx...这只是添加了几行LINQ语法,或者我做的全部错了吗?我阅读了有关LINQ不完全兼容MySQL的内容。如果我使用的是MSSQL,如果我使用的是MySQL,那么我的代码会是什么样子?

编辑:

UserDAL.cs:

public class UserDAL 
{ 
    public static List<User> UserData() 
    { 
     using (var ctx = new MyEntities()) 
     {     
      var userData = ctx.Users.ToList(); 

      return userData; 
     } 
    } 
} 

MyModel.Context.cs(自动生成的代码):

[DbConfigurationType(typeof(MySqlEFConfiguration))] 
public partial class MyEntities : DbContext 
{ 
    public SloRideEntities() 
     : base("name=MyEntities") 
    { 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     throw new UnintentionalCodeFirstException(); 
    } 

    public virtual DbSet<User> Users { get; set; } 
    public virtual DbSet<Ride> Rides { get; set; } 
} 

User.cs(自动生成的代码):

public partial class User 
{ 
    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")] 
    public User() 
    { 
     this.Rides = new HashSet<Ride>(); 
    } 

    public long Id { get; set; } 
    public string Username { get; set; } 
    public string Password { get; set; } 

    [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")] 
    public virtual ICollection<Ride> Rides { get; set; } 
} 
+0

LINQ是一种语言技术 - 如果你的意思是“不与MySQL完全兼容”你不谈论LINQ,但LINQ提供程序。 – TomTom

+0

'不完全兼容'我的意思是需要额外的软件包才能正常工作。 – Tomo

+0

也没有意义,因为标准.NET中的ONLY包是LINQ to Objects(针对内存中的对象)。实体框架也是一个外部包。 – TomTom

回答

0

你必须添加一个DbSet<User>到你的上下文类

public class ApplicationDbContext : DbContext 
{ 
    public ApplicationDbContext() : base(nameOrConnectionString: "MyEntities") { } 
    public virtual DbSet<Users> Users { get; set; } 
} 

然后你写

var userData = ctx.Users.ToList(); 
-1

假设ApplicationDbContext是基于你的实体模型(EDMX文件,数据库第一种方法),实体框架T4模板生成的类,并已列入你的mydb.User在模型中 - 那么你的ApplicationDbContext类应该有一个名为User(s)的属性,这个属性可以是用户的集合。 所以,你将不得不像下面

using (var ctx = new ApplicationDbContext()) 
{ 
    return ctx.Users.ToList();      
} 
+0

我收到此错误:_ EntityFramework.dll中发生类型'System.Data.Entity.Core.EntityCommandExecutionException'的异常,但未在用户代码中处理 附加信息:执行命令定义时发生错误。有关详细信息,请参阅内部异常._然后LINQ查询在哪里? – Tomo

+0

它现在可以工作,但我不得不用Db First方法创建一个新的实体数据模型。在开始时我手动添加了我的_ApplicationDbContext.cs_。我期望一些简单的东西,比如用LINQ改变我的Raw SQL。现在代码的数量是相同的,但有一堆新文件。我更喜欢原始SQL,它更简单,矛盾。 – Tomo

+0

直接在代码中使用嵌入式SQL通常被认为是不好的做法 - 原因很多。 ORM有许多好处,例如考虑如果您添加相关实体(例如用户拥有一个Department),您的代码将如何更改。 如果你坚持保留原始的sql,这是不推荐的,至少将它移动到你的应用程序中的适当层 - 它应该在DAL中,在一些存储库中,而不是在控制器中 – ironstone13