I可查询不同类型

问题描述 投票:0回答:1

我有一个

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
会抛出

表达式树可能不包含动态操作

这是否可能以某种方式实现,还是比它的价值更麻烦?

c#
1个回答
0
投票

如果代码必须以这种方式构建,您可以创建一个具有 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.