2016-03-06 30 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