簡體   English   中英

ASP.NET MVC C#中的數據類型轉換問題

[英]Data Type casting issue in asp.net mvc c#

我必須將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; }
}

我擺脫了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);
}

問題歸結為您在此處快速而松散地玩弄類型。 首先,當您從數據庫中提取任務時,您將其選擇到一個匿名對象中 ,即select new { ... } 現在的結果是DbQuery<[AnonymousType]> 這是您在緩存中設置的內容。 然后,當您將其拉出時,嘗試將其IQueryableIQueryable 沒關系,但是現在您甚至不再擁有匿名類型的動態性質。

接下來,將整個內容再次轉換為Task1Data 由於兩個原因,這行不通。 首先,這里有一個項目集合,您將永遠無法將它們轉換為Task1Data類的非集合類。 其次,即使您將其更正確地轉換為IEnumerable<Task1Data>之類的集合中的項目的成員也不匹配Task1Data屬性。 它們甚至不是Task1Data東西,因此您永遠無法回Task1Data

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM