【问题标题】:How to rewrite from Raw SQL to LINQ?如何从原始 SQL 重写为 LINQ?
【发布时间】:2016-03-06 19:39:36
【问题描述】:

我想用 LINQ 替换我的原始 SQL。这是我的代码:

我的控制器:

        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,我的代码会是什么样子?

编辑:

用户DAL.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; }
}

【问题讨论】:

  • LINQ 是一种语言技术 - 如果您的意思是“与 MySQL 不完全兼容”,那么您不是在谈论 LINQ,而是在谈论 LINQ 提供者。
  • “不完全兼容”是指需要额外的软件包才能使其正常工作。
  • 也没有任何意义,因为 .NET 中唯一的标准包是 LINQ to Objects(针对内存中的对象)。 Entity Framework 也是一个外部包。

标签: c# mysql entity-framework linq rawsql


【解决方案1】:

你必须在你的上下文类中添加一个DbSet&lt;User&gt;

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

那你写

var userData = ctx.Users.ToList();

【讨论】:

    【解决方案2】:

    假设 ApplicationDbContext 是 Entity Framework T4 模板根据您的实体模型(edmx 文件,数据库优先方法)生成的类,并且您已将 mydb.User 包含在模型中 - 那么您的 ApplicationDbContext 类应该有一个名为 User( s) 这将是用户的集合。 所以你会有类似下面的东西

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

    【讨论】:

    • 我收到此错误:EntityFramework.dll 中发生“System.Data.Entity.Core.EntityCommandExecutionException”类型的异常,但未在用户代码中处理其他信息:出现错误时执行命令定义。有关详细信息,请参阅内部异常。 那么 LINQ 查询在哪里?
    • 它现在可以工作了,但我必须使用 Db First 方法创建一个新的实体数据模型。一开始我手动添加了我的 ApplicationDbContext.cs。我期待一些更简单的事情,比如用 LINQ 更改我的 Raw SQL。现在代码量是一样的,但是有一堆新文件。我更喜欢 Raw SQL,它更简单,但矛盾的是。
    • 在代码中直接使用嵌入式 SQL 通常被认为是一种不好的做法 - 原因有很多。 ORM 有很多好处,例如,如果您添加相关实体,例如用户有一个部门,您的代码将如何更改。如果您坚持使用不推荐的原始 sql,至少将其移动到应用程序中的适当层 - 它应该在 DAL 中,在某个存储库中,而不是在控制器中
    • 感谢您的提示。你能给我一个很好的工作 .NET 应用程序架构示例或者一些教程,这样我就可以学习如何做一个正确的架构以及如何为文件、类、方法等提供正确的名称?
    • 不确定我能否为您指出简短的教程,但我可以推荐几本书。您不必从头到尾阅读这些内容,但我敢打赌您会想要阅读,因为这是一本很棒的书。因此,关于编码标准、习惯用法、样式和原则 - 简洁代码:敏捷软件工艺手册 - amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/… 关于企业架构 - Microsoft .NET - 为企业构建应用程序 - amazon.com/Microsoft-NET-Architecting-Applications-Enterprise/…
    猜你喜欢
    • 2016-10-20
    • 2021-02-11
    • 2021-09-12
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2021-12-05
    相关资源
    最近更新 更多