我编写了一个LINQ查询来填充listview,但它使用的是.ToString()方法,这种方法显然是不允许的。当我使用下面的代码时,我收到错误消息:
错误:LINQ to Entities无法识别方法'System.String ToString()'方法,并且此方法无法转换为商店表达式
有没有办法在LINQ中使用ToString(),或者如果不可能,在查询中将DateTime转换为String的解决方案是什么。请知道ReleaseDateName是一个字符串,ReleaseDate是一个DateTime
using (var db = new ReleaseInfo())
{
lvReleaseInfo.DataSource = (from r in db.MediaReleases
join rn in db.ReleaseNames
on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rn.MediaReleaseID, rn.CultureCodeID }
join plat in db.MediaPlatforms
on new { MediaPlatformID = r.MediaPlatformID, CultureCodeID } equals new { plat.MediaPlatformID, plat.CultureCodeID }
join pub in db.MediaPublishers
on new { MediaPublisherID = r.MediaPublisherID, CultureCodeID } equals new { pub.MediaPublisherID, pub.CultureCodeID }
join c in db.Countries
on new { CountryID = r.CountryID, CultureCodeID } equals new { c.CountryID, c.CultureCodeID }
join rd in db.ReleaseDates
on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { rd.MediaReleaseID, rd.CultureCodeID }
join a in db.AffiliateLinks
on new { MediaReleaseID = r.MediaReleaseID, CultureCodeID } equals new { a.MediaReleaseID, a.CultureCodeID }
where r.SectionID == SectionID
select new
{
rn.ReleaseTitle,
plat.MediaPlatformName,
pub.MediaPublisherName,
c.CountryName,
ReleaseDate = (rd.ReleaseDate == null ? rd.ReleaseDateName : rd.ReleaseDate.ToString()),
a.AffiliateLinkAddress
}).ToList();
lvReleaseInfo.DataBind();
}
答案 0 :(得分:8)
由于您无论如何都要将查询具体化,您可以在.NET端进行转换,而不是在RDBMS中进行转换,如下所示:
...
select new {
rn.ReleaseTitle,
plat.MediaPlatformName,
pub.MediaPublisherName,
c.CountryName,
rd.ReleaseDateName,
rd.ReleaseDate,
a.AffiliateLinkAddress
}).AsEnumerable() // <<== This forces the following Select to operate in memory
.Select(t => new {
t.ReleaseTitle,
t.MediaPlatformName,
t.MediaPublisherName,
t.CountryName,
ReleaseDate = t.ReleaseDateName ?? t.ReleaseDate.ToString()
t.AffiliateLinkAddress
}).ToList();
由于在ToString()
的元素上调用IEnumerable<T>
,因此它将不再失败。另请注意使用??
运算符代替空值检查? :
条件。
答案 1 :(得分:0)
问题是,在字段被反序列化之前,您无法在字段上调用ToString()
。因此,不要试图在查询中调用ToString()
,而只需在之后对结果执行此操作。
在数据库中,您正在操作的值没有ToString()
的概念,这就是您收到错误的原因。查询可能看起来和感觉像C#代码,但请记住,在任何其他情况下转换为SQL查询的封面。返回列表后,您可以编写一个非常简单的LINQ查询来解决问题。