列表中的OR的C#linq lambda表达式

时间:2016-08-31 15:33:35

标签: c# linq lambda

我有这种情况,我用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;
                }
            });
        }

4 个答案:

答案 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)

您可以使用Expression.OrElse或使用enter link description here

为where子句构建表达式

答案 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();