![](/img/trans.png)
[英]ASP.NET MVC/C# - Type casting to an array in a custom required validation attribute
[英]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]>
。 這是您在緩存中設置的內容。 然后,當您將其拉出時,嘗試將其IQueryable
為IQueryable
。 沒關系,但是現在您甚至不再擁有匿名類型的動態性質。
接下來,將整個內容再次轉換為Task1Data
。 由於兩個原因,這行不通。 首先,這里有一個項目集合,您將永遠無法將它們轉換為Task1Data
類的非集合類。 其次,即使您將其更正確地轉換為IEnumerable<Task1Data>
之類的集合中的項目的成員也不匹配Task1Data
屬性。 它們甚至不是Task1Data
東西,因此您永遠無法回Task1Data
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.