【问题标题】:Execute Sql query in entity framework在实体框架中执行Sql查询
【发布时间】:2019-03-05 18:24:42
【问题描述】:

我有一个 jquery 数据表,我想在其中显示从 sql 查询生成的汇总报告,但我做不到,它在查询中显示错误。汇总报告包含所有月份名称和每个月的条目数。

错误:

System.Data.Entity.Core.EntityCommandExecutionException: '数据读取器与指定的 'DHIFeedbackModel.FeedBack' 不兼容。类型的成员“FeedbackUserName”在数据读取器中没有同名的对应列。'

public ActionResult LoadData()
{
    using (DHIFeedbackEntities2 Ms = new DHIFeedbackEntities2())
    {

        //var summary = Ms.FeedBacks.SqlQuery("select * from [DHIFeedback].[dbo].[FeedBack]").ToList<FeedBack>();
        var summary = Ms.FeedBacks.SqlQuery(
            @"SELECT * 
            FROM 
                (
                SELECT 
                    YEAR([FeedBackDate])[Year],DATENAME(MONTH, [FeedBackDate])[Month],
                    COUNT(1)[FeedbackID] 
                FROM 
                    [DHIFeedback].[dbo].[FeedBack] 
                GROUP BY 
                    YEAR([FeedBackDate]
                ),
                DATENAME(MONTH, [FeedBackDate])) AS Monthlyupdate 
                PIVOT(SUM([FeedbackID]) FOR Month IN([January],[February],[March],[April],[May],[June],[July],[August],[September],[October],[November],[December])) AS MNamePivot 
            order by 1,2"
        ).FirstOrDefault<FeedBack>();
        return Json(new { data = summary }, JsonRequestBehavior.AllowGet);


    }
}

和javascript:

$(document).ready(function () {
            $('#Summary').DataTable({

                "processing": true,

                "ajax": {
                    "url": "/Summary/LoadData",
                    "type": "GET",
                    "datatype": "json",

                },
                "lengthMenu": [
                    [5, 10, 25, 50, 100, -1],
                    [5, 10, 25, 50, 100, "All"]
                ],
                "autoWidth": true,
                "responsive": true,
                "lengthChange": true,
                "ordering": true,
                "fnRowCallback": function (nRow, aData, iDisplayIndex) {
                    var oSettings = this.fnSettings();
                    $("td:first", nRow).html(oSettings._iDisplayStart + iDisplayIndex + 1);
                    return nRow;
                },
                "columns": [

                    { "data":"Year", "autoWidth": true },
                    { "data":"January", "autoWidth": true },
                    { "data":"February", "autoWidth": true },
                    { "data":"March", "autoWidth": true },
                    { "data":"April", "autoWidth": true },
                    { "data":"May", "autoWidth": true },
                    { "data":"June", "autoWidth": true },
                    { "data":"July", "autoWidth": true },
                    { "data":"August", "autoWidth": true },
                    { "data":"September", "autoWidth": true },
                    { "data":"October", "autoWidth": true },
                    { "data":"November", "autoWidth": true },
                    { "data":"December", "autoWidth": true }
                ]
            });
        });


 public partial class FeedBack
    {
        public int FeedbackID { get; set; }
        public string FeedbackUserName { get; set; }
        public string FeedBackUserEmailID { get; set; }
        public string FeedBackComment { get; set; }
        public string Designation { get; set; }
        public string Organization { get; set; }
        public string ContactNo { get; set; }
        public string City { get; set; }
        public Nullable<System.DateTime> FeedBackDate { get; set; }
        public Nullable<double> IsPublished { get; set; }
        public string Reply { get; set; }
        public Nullable<double> IsReplied { get; set; }
        public Nullable<System.DateTime> ReplyDate { get; set; }
        public string ReplyBy { get; set; }
        public string Sector { get; set; }
        public Nullable<int> Status { get; set; }

        public int Year { get; set; }
        public int January { get; set; }
        public int February { get; set; }
        public int March { get; set; }
        public int April { get; set; }
        public int May { get; set; }
        public int June { get; set; }
        public int July { get; set; }
        public int August { get; set; }
        public int September { get; set; }
        public int October { get; set; }
        public int November { get; set; }
        public int December { get; set; }
        public string Monthlyupdate { get; set; }
        public string Month{ get; set; }
        [NotMapped]
        public List<FeedBack> FeedBackCollection { get; set; }

【问题讨论】:

  • 您正在使用 ORM。为什么要编写自己的 SQL 查询而不是只使用 ORM?
  • 你能解决我的问题吗
  • 错误是什么? ??
  • @sunnykumar 问题是代码中嵌入了一个复杂的查询。而是将其放在视图或存储过程中,以便您可以单独对其进行改进和优化。
  • System.Data.Entity.Core.EntityCommandExecutionException: '数据读取器与指定的 'DHIFeedbackModel.FeedBack' 不兼容。类型的成员“FeedbackUserName”在数据读取器中没有同名的对应列。'

标签: asp.net-mvc entity-framework


【解决方案1】:

该错误意味着 ORM 需要一个包含 FeedBacks 的每个属性的结果集,包括名为 FeedbackUserName 的属性

因此您需要编辑 sql 的 select 子句以返回所有预期的列。

或者你可以使用

Ms.Database.SqlQuery<SomeType>(
                   "your query here").ToList();

SomeType 在哪里:

public class SomeType {
    public int Year {get; set;}        
    //... and/or all the pivoted columns
}

【讨论】:

  • 但是我需要的列,以及我需要的预期输出只从这个查询中生成。
  • 仍然显示同样的问题,我尝试了 public int year {get:set;}, public int january{get:set:}
  • 您应该在错误消息中使用不同的成员名称
  • '数据读取器与指定的'DHIFeedbackModel.FeedBack'不兼容。类型的成员“FeedbackID”在数据读取器中没有同名的对应列。'
  • 我有上面代码中的模型类,你也可以看到
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2016-05-28
相关资源
最近更新 更多