我有这种情况,我用FindByMany查询(如果用户国家和类别匹配,则接受lambda并返回post,(如“else”中所示) 但是现在我需要使用来自用户的首选子类别来定制返回,所以我正在做的是查询n次foreach子类别和addRange。如果用户有5个子类别作为收藏,我不想查询db的5倍,但我不知道如何应用dinamic OR。
所以我的问题是,如何改进此代码以提高性能。
private void showPopupMenu(View view) {
PopupMenu popupMenu = new PopupMenu(mContext, view);
MenuInflater inflater = popupMenu.getMenuInflater();
inflater.inflate(R.menu.menu_overflow_extra, popupMenu.getMenu());
popupMenu.show();
popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.popup_share:
return true;
case R.id.popup_cast:
return true;
}
return false;
}
});
}
答案 0 :(得分:4)
您是否可以将子类别定位到列表中,然后在FindBy
中使用thatlist.Contains()
?
答案 1 :(得分:0)
您可以使用一个查询获取用户的子类别,然后使用列表和Contains
方法过滤相关帖子。大多数LINQ查询提供了Contains
方法,并且应该将其翻译成单个数据库查询。
var subcategories = user.SubCategories.ToList();
foreach (var temp in _contentRepository.FindManyBy(
c =>
c.Country.Id == country.Id && c.Category.Id == theCategory.Id &&
subcategories.Contains( subCategory.Id ) ).ToList()))
{
posts.AddRange(temp);
}
答案 2 :(得分:0)
答案 3 :(得分:0)
问题的核心是你强迫每个项目执行查询而不是动态构建查询。 @Milney有正确的想法;以下示例代码。
IEnumerable<int> subCategoryIds = user.SubCategories.Select(x => x.Id);
var posts = _contentRepository.FindByMany(c => c.Country.Id == country.Id
&& c.Category.Id == theCategory.Id
&& subCategoryIds.Contains(c.SubCategoryId)).ToList();