我有一个
IQueryable
,我根据搜索参数添加 Where
子句。目前,这会查询数据库,因此类型为 Music
(IQueryable<Music>
)。
我意识到我有一个该数据已批准行的缓存(即这些行的已批准标志设置为 true)。
所以为了更高效,我想我应该搜索缓存而不是数据库。缓存保存相同的记录,但它们已转换为 DTO,因此将是一个
IQueryable<MusicDTO>
。
我试过这个:
if (search.Approved == true)
{
IQueryable<MusicDTO> query = Cache.regetCachedMusics().AsQueryable();
}
else
{
IQueryable<Music> query = DBContext.Musics;
}
if (search.ID.HasValue)
query = query.Where(x => x.ID == search.ID); //There are more of these
这不允许我添加 where 子句,因为它表示查询不存在。
所以我尝试了:
IQueryable<dynamic> query;
if (search.Approved == true)
{
query = Cache.regetCachedMusics().AsQueryable();
}
else
{
query = DBContext.Musics;
}
if (search.ID.HasValue)
query = query.Where(x => x.ID == search.ID); //There are more of these
但这不起作用,因为
x.ID == Search.ID
会抛出
表达式树可能不包含动态操作
这是否可能以某种方式实现,还是比它的价值更麻烦?
如果代码必须以这种方式构建,您可以创建一个具有 ID 属性的接口,如下所示:
public interface IMusic
{
int ID { get; set; }
}
如果
Music
和MusicDTO
都实现了这个接口,你可以这样做:
IQueryable<IMusic> query;
if (search.Approved)
{
query = Cache.regetCachedMusics().AsQueryable();
}
else
{
query = DBContext.Musics;
}
if (search.ID.HasValue)
{
query = query.Where(x => x.ID == search.ID);
}