5

我编写了一个 LINQ 查询来填充列表视图,但它使用了 .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();
}
4

2 回答 2

9

由于无论如何您都在将查询具体化以列出,因此您可以在 .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>,它将不再失败。还要注意使用??运算符代替空检查? :条件。

于 2013-05-14T00:43:42.670 回答
0

ToString()问题是在反序列化之前不能调用字段。因此,与其尝试调用ToString()查询,不如在事后对结果执行此操作。

在数据库中,您正在操作的值不ToString()知道您收到错误的原因。该查询可能看起来和感觉像 C# 代码,但请记住,在幕后,它正像任何其他查询一样被转换为 SQL 查询。取回列表后,您可以编写一个非常简单的 LINQ 查询来解决问题。

于 2013-05-14T00:44:07.567 回答