【问题标题】:Entity Framework 6 mapping a custom SQL query to an EntityEntity Framework 6 将自定义 SQL 查询映射到实体
【发布时间】:2018-02-16 01:14:00
【问题描述】:

目前我对 ASP.NET MVC 和实体框架非常陌生。目前我已经使用它大约 3 个月了。

我有一个运行 Entity Framework 6 的 ASP.NET MVC 5 应用程序。这是来自启用了自动迁移的现有数据库的代码优先方法,因此我的所有实体类都是自动生成的。我正在尝试向我的 MVC 应用程序添加一个返回特定结果集的视图。目前,以前的开发人员将应用程序设置为仅接受实体类以将数据显示到 DataTable DataTables.net。进一步澄清:

我的模型中有两个实体表,它们是 MySQL 中的表。

| Samples           | SampleLocation |
|:------------------|---------------:|
| Id                |     LocationId |        
| DateAssigned      |           Name |      
| CheckedInDate     |           Size |         
| SampleLocationId  |                |        
| ...etc            |         ...etc |          

我想要完成的是查询两个表并将结果返回到我的 MVC 应用程序的视图中。从那里运行更新并更新 Samples 表中的几列。以下是返回我需要的结果的大致查询。

SELECT Samples.Id, samples.CheckedInDate, SampleLocation.Name, SampleLocation.Size, 
SampleLocation.LocationId 
FROM (Samples join SampleLocation 
ON ((Samples.SampleLocationId = SampleLocation.LocationId))) 
WHERE  isnull(samples.CheckedInDate) ORDER BY samples.Id

根据我所做的研究,有几种方法可以做到这一点。我尝试过的可以给我一个可以使用的类的方法是创建一个存储过程,然后更新模型——这会破坏模型并取消映射模型中的每个实体。我尝试使用查询创建一个视图以添加到模型中 - 但这也会破坏它并取消映射所有内容。后来我发现这是一个错误。

所以我的问题是,如何将查询映射到将结果返回到视图的实体?有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: c# asp.net-mvc entity-framework entity-framework-6


    【解决方案1】:

    有几种方法可以完成您想做的事情,仅使用实体框架或Dapper等额外工具

    仅限实体框架:

    首先你可以使用Linq来提取数据,我会是这样的:

    var list = from s in Samples
               join l in SampleLocations
                   on s.Id equals l.LocationId
               where s.CheckedInDate == null
               select new
               {
                    s.Id,
                    s.CheckedInDate,
                    l.Name,
                    l.Size, 
                    l.LocationId 
               };
    

    小巧玲珑:

    第二种方法是使用 dapper,这里唯一真正的区别是您将直接处理您的查询,因此您可以使用类似这样的东西来代替 linq:

    Connection.Query(@"SELECT Samples.Id, samples.CheckedInDate,  
                         SampleLocation.Name, SampleLocation.Size, 
                         SampleLocation.LocationId 
                       FROM Samples
                         join SampleLocation 
                           ON Samples.SampleLocationId = SampleLocation.LocationId
                       WHERE isnull(samples.CheckedInDate) ORDER BY samples.Id");
    

    对于两者:

    在您的更新方法中,您首先必须检索实体,为此您可以使用DbSet.Find 方法或其他查询,然后调用DbConext.SaveChanges

    【讨论】:

    • 感谢您的回复。我唯一的问题是我需要结果来填充类的视图。将结果显示到 DataTable 的方法只接受 Entity 类。除非有其他方法解决这个问题?
    • 在 EF 中,您只需将匿名类替换为您的实体类,而对于 dapper,将 Query 方法替换为 Query
    • 它的设置方式是从 EF 中的模型中查找一个类。如果我只是在模型之外添加一个普通类,它不会捡起它
    • 抱歉,我不明白您的问题,在我的 EF 示例中,如果您只想返回特定类型,那么只需将匿名类型替换为您想要的类型即可。
    • Roy - 检查我发布的答案。这对我有用。
    【解决方案2】:

    这是我的问题的解决方案。基本上是在 XML 中手动创建实体并将其映射到虚拟表。Entity Framework DefiningQuery

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-31
      • 2014-08-26
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 2021-08-30
      • 1970-01-01
      相关资源
      最近更新 更多