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);
}
我在最后一行得到以下异常:
An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code
Additional information: Unable to cast the type 'Anonymous type' to type 'Models.Task1data'. LINQ to Entities only supports casting EDM primitive or enumeration types.
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 转换,因为它们不是必需的(而且不正确)并且只使用了总数据 class。另外,我创建了一个新类型来存储名为 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
。那应该没问题,但现在您甚至不再具有匿名类型的动态特性。
接下来,您将整个内容再次投射到 Task1Data
。这行不通有两个原因。首先,您在这里有一个项目集合,您永远无法像 Task1Data
那样将其转换为非集合 class。其次,即使您将其更正确地转换为 IEnumerable<Task1Data>
之类的内容,集合中项目的成员也不匹配 Task1Data
中的属性。它们甚至都不是一回事,所以你永远不能转换回 Task1Data
.
我必须将 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);
}
我在最后一行得到以下异常:
An exception of type 'System.NotSupportedException' occurred in System.Data.Entity.dll but was not handled in user code
Additional information: Unable to cast the type 'Anonymous type' to type 'Models.Task1data'. LINQ to Entities only supports casting EDM primitive or enumeration types.
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 转换,因为它们不是必需的(而且不正确)并且只使用了总数据 class。另外,我创建了一个新类型来存储名为 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
。那应该没问题,但现在您甚至不再具有匿名类型的动态特性。
接下来,您将整个内容再次投射到 Task1Data
。这行不通有两个原因。首先,您在这里有一个项目集合,您永远无法像 Task1Data
那样将其转换为非集合 class。其次,即使您将其更正确地转换为 IEnumerable<Task1Data>
之类的内容,集合中项目的成员也不匹配 Task1Data
中的属性。它们甚至都不是一回事,所以你永远不能转换回 Task1Data
.