0

我正在尝试使用信息窗口在谷歌地图上映射各种标记。在我尝试通过控制器传递字符串之前,一切正常。

我收到以下错误:

“LINQ to Entities 无法识别 'System.String GetMainPhoto(Int32)' 方法,并且该方法无法转换为存储表达式。”

我读过这主要是因为 ToString 方法或其他一些方法无效使用造成的。但是,我不确定在这种情况下如何纠正这个错误。

基本上,我有一个 db - PropertyPhoto 保存图片的文件名。GetMainPhoto 基本上查找所有行并返回主图片文件名。

public string GetMainPhoto(int id)
        {
            return db.PropertyPhotos.Single(p => p.PropertyId == id && p.MainPic == true).PhotoLocation;

        }

控制器如下:

public ActionResult Map()
        {
            if (Request.IsAjaxRequest())
            {
                var properties = websiteRepository.FindAllProperties();

                var jsonProperties = from property in properties
                                     select new JsonProperty
                                     {
                                         PropertyId = property.PropertyId,
                                         NoOfBedroom = property.NoOfBedrooms,
                                         Price = property.Price,
                                         Address1 = property.PropertyAddress.Address1,
                                         MainPicSrc = websiteRepository.GetMainPhoto(property.PropertyId),
                                         Latitude = property.PropertyAddress.Latitude,
                                         Longitude = property.PropertyAddress.Longitude
                                     };

                return Json(jsonProperties.ToList(), JsonRequestBehavior.AllowGet);
            }
            else 
            {
                return View();
            }
        }
4

1 回答 1

2

尝试.ToList()在投影到匿名类型之前先调用来热切加载数据,否则 EF 不知道如何将websiteRepository.GetMainPhoto调用转换为 SQL:

var properties = websiteRepository.FindAllProperties().ToList();

不过要小心。通过这样做,您可能会遇到SELECT N+1 问题,因为对于初始结果集中的每个元素,您将发送一个 SQL 查询来获取MainPicSrc属性。

更好的方法是join直接由数据库执行此操作而不使用websiteRepository.GetMainPhoto调用。

于 2012-10-08T16:26:40.000 回答