2012-10-04 132 views
0

我在这里读了一些问题,但他们都可以被定义为独立的变量,但我认为我是有点不同:LINQ到实体无法识别方法“System.String内容(System.String)”

var sliderRecordList = this._sliderService.GetAllAsQueryable();  
    var sliderModelList = sliderRecordList.Select(record => new SliderModel() 
     { 
     Id = record.Id, 
     SlideName = record.SlideName, 
     SlideOrder = record.SlideOrder, 
     SlideUrl = record.SlideUrl, 
     SlideImageUrl = Url.Content("~/Content/AhsenSliderImages/" + record.Id + ".jpg"), 
     Enabled = record.Enabled 
    }); 

问题依赖于调用方法Url.Content()。任何建议?我试图删除Url.Content()方法,并没有工作。

回答

2

首先对查询进行Materalize,然后设置UI关注点。

var sliderRecordList = this._sliderService.GetAllAsQueryable().ToList(); 
var sliderModelList = sliderRecordList 
    .Select(record => new SliderModel 
     { 
     Id = record.Id, 
     SlideName = record.SlideName, 
     SlideOrder = record.SlideOrder, 
     SlideUrl = record.SlideUrl, 
     SlideImageUrl = Url.Content("~/Content/AhsenSliderImages/" + record.Id + ".jpg"), 
     Enabled = record.Enabled 
    }); 

.ToList()将首先执行查询。

在一个侧面说明,可以考虑使用AutoMapper把上面的代码逼到了几行:

var sliderRecordList = this._sliderService.GetAllAsQueryable().ToList(); 
var sliderModelList = Mapper.Map<ICollection<SliderRecord>, ICollection<SliderModel>>(sliderRecordList); 

URL生成可以在视图来完成。

+0

那么,这就是我所避免的,但似乎我没有任何其他的机会! – Tarik

+0

@DorianGray - 实体框架需要创建“常量”来实现查询。为什么你会尝试并避免这种情况?如果你首先进行maternal化,那么没有任何区别,因为无论如何你都不会过滤查询。 – RPM1984

+0

我将'sliderModelList'传递给其他一些方法,并在方法内部应用过滤,具体取决于哪些方法使用'IQueryable <>',以便它们可以在使用它之前对其进行过滤并获得最少的数据量。 – Tarik

1

这是因为函数Url.Content无法转换为其SQL等效函数。使用AsEnumerable函数的名单,并试一试

var sliderModelList = sliderRecordList.AsEnumerable.Select(record => new SliderModel() 
     { 
     Id = record.Id, 
     SlideName = record.SlideName, 
     SlideOrder = record.SlideOrder, 
     SlideUrl = record.SlideUrl, 
     SlideImageUrl = Url.Content("~/Content/AhsenSliderImages/" + record.Id + ".jpg"), 
     Enabled = record.Enabled 
    }); 

祝你好运。

相关问题