【问题标题】:Data Type casting issue in asp.net mvc c#asp.net mvc c#中的数据类型转换问题
【发布时间】:2015-05-15 14:47:45
【问题描述】:

我必须将我的 linq 的结果保存在缓存中,然后再检索它。但我收到以下代码错误:

public PartialViewResult showall()
{
    //initially getting data from DB
    var task1 = from r in _db.Task1
            where r.Status == true
            orderby r.Post_Date descending
            select new
            {
             id = SqlFunctions.StringConvert((double)r.Task1_ID),
             dt = r.Post_Date,
             typ = "Task1"
            };
    HttpContext.Cache.Insert(key: "Task1Data",
                         value: task1, 
                         dependencies: null, 
                         absoluteExpiration: DateTime.Now.AddHours(5), 
                         slidingExpiration: System.Web.Caching.Cache.NoSlidingExpiration
                         );
    var task1Cache = (System.Web.HttpContext.Current.Cache["Task1Data"] as IQueryable);
    var task1list = from a in task1Cache.Cast<Task1data>()
                select new
                {
                 id = SqlFunctions.StringConvert((double)a.Task1_ID),
                 dt = a.Post_Date,
                 typ = a.typ 
                }; 
    var task2 = from r in _db.Task2
            orderby r.Post_Date descending
            select new
            {
             id = SqlFunctions.StringConvert((double)r.Task2_ID),
             dt = r.Post_Date,
             typ = "Task2"
            };
    HttpContext.Cache.Insert(key: "Task2Data",
                         value: task2, 
                         dependencies: null, 
                         absoluteExpiration: DateTime.Now.AddHours(5), 
                         slidingExpiration: System.Web.Caching.Cache.NoSlidingExpiration
                         );
    var task2Cache = (System.Web.HttpContext.Current.Cache["Task2Data"] as IQueryable);
    var task2list = from a in task2Cache.Cast<Task2data>()
                select new
                {
                 id = SqlFunctions.StringConvert((double)a.Task2_ID),
                 dt = a.Post_Date,
                 typ = a.typ 
                }; 
    var listc = task1list.Union(task2list);
    var q3 = (from r in listc.Cast<Totaldata>() 
                 select new
                 {
                     mix = r.typ + "~" + r.id
                 }).ToList();
    return PartialView("~/Views/Ex/_ShowAll.cshtml", q3);
}

我在最后一行得到以下异常:

System.Data.Entity.dll 中出现“System.NotSupportedException”类型的异常,但未在用户代码中处理

附加信息:无法将类型“匿名类型”转换为类型“Models.Task1data”。 LINQ to Entities 仅支持转换 EDM 基元或枚举类型。

public class Task1data
{
    public double Task1_ID { get; set; }
    public DateTime Post_Date { get; set; }
    public string typ { get; set; }
}

public class Task2data
{
    public double Task2_ID { get; set; }
    public DateTime Post_Date { get; set; }
    public string typ { get; set; }
}

public class Totaldata
{
    public double id { get; set; }
    public DateTime Post_Date { get; set; }
    public string typ { get; set; }
}

【问题讨论】:

  • 您在控制器中选择了带有select new 的匿名类型,在您看来,您可能将Task1data 指定为模型,因此出现错误。
  • 事实并非如此。没有功能适用于 q3。像 q3.c​​ount() 它给出的异常类型不支持。

标签: c# asp.net linq asp.net-mvc-4 caching


【解决方案1】:

我已经摆脱了 task1data 和 task2data 强制转换,因为它们不是必需的(也不正确)并且只使用了 totaldata 类。另外,我创建了一个新类型来存储结果,称为something,因为你不能传递匿名类型。

public something() { public string mix {get;set;}}
public PartialViewResult showall()
{
    //initially getting data from DB
    var task1 = from r in _db.Task1
            where r.Status == true
            orderby r.Post_Date descending
            select new Totaldata
            {
             id = SqlFunctions.StringConvert((double)r.Task1_ID),
             dt = r.Post_Date,
             typ = "Task1"
            };
    HttpContext.Cache.Insert(key: "Task1Data",
                         value: task1, 
                         dependencies: null, 
                         absoluteExpiration: DateTime.Now.AddHours(5), 
                         slidingExpiration: System.Web.Caching.Cache.NoSlidingExpiration
                         );
    var task1Cache = (System.Web.HttpContext.Current.Cache["Task1Data"] as IQueryable<Totaldata>);
    var task1list = from a in task1Cache
                select new Totaldata
                {
                 id = SqlFunctions.StringConvert((double)a.Task1_ID),
                 dt = a.Post_Date,
                 typ = a.typ 
                }; 
    var task2 = from r in _db.Task2
            orderby r.Post_Date descending
            select new Totaldata
            {
             id = SqlFunctions.StringConvert((double)r.Task2_ID),
             dt = r.Post_Date,
             typ = "Task2"
            };
    HttpContext.Cache.Insert(key: "Task2Data",
                         value: task2, 
                         dependencies: null, 
                         absoluteExpiration: DateTime.Now.AddHours(5), 
                         slidingExpiration: System.Web.Caching.Cache.NoSlidingExpiration
                         );
    var task2Cache = (System.Web.HttpContext.Current.Cache["Task2Data"] as IQueryable<Totaldata>);
    var task2list = from a in task2Cache
                select new Totaldata
                {
                 id = SqlFunctions.StringConvert((double)a.Task2_ID),
                 dt = a.Post_Date,
                 typ = a.typ 
                }; 
    var listc = task1list.Union(task2list);
    var q3 = (from r in listc 
                 select new something
                 {
                     mix = r.typ + "~" + r.id
                 }).ToList();
    return PartialView("~/Views/Ex/_ShowAll.cshtml", q3);
}

【讨论】:

  • 另一方面,这段代码有很多错误,我无法在不了解更多信息的情况下修复它。您存储在缓存中的数据类型似乎是Totaldata 类型,您将其拉出,然后将其转换为不同的(不兼容的类型),然后访问数据中不存在的成员(Task1_ID)缓存。您需要自己纠正这些问题。也许您试图更改放入缓存中的数据类型?对不起,您的原始代码和我的原始代码都不应该编译和运行。
【解决方案2】:

问题归结为您在此处使用类型时又快又松。首先,当您从数据库中提取任务时,您将它们选择到一个匿名对象中,即select new { ... }。现在的结果是DbQuery&lt;[AnonymousType]&gt;。这是您在缓存中设置的内容。然后,当您将其拉出时,您会尝试将其转换为IQueryable。这应该没问题,但现在您甚至不再具有匿名类型的动态特性。

接下来,您再次将整个内容投射到Task1Data。这行不通有两个原因。首先,您在这里有一个项目集合,您将永远无法将其转换为像 Task1Data 这样的非集合类。其次,即使您将其更正确地转换为IEnumerable&lt;Task1Data&gt; 之类的东西,集合中的项目成员也不匹配Task1Data 中的属性。它们甚至根本不是一回事,所以你永远不能回溯到Task1Data。

【讨论】:

    猜你喜欢
    • 2022-08-19
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多