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

列表或列表中的C#linq lambda表达式,c#,linq,lambda,C#,Linq,Lambda,在这个场景中,我使用FindByMany进行查询(如果用户所在国家和类别匹配,则使用lambda并返回post)(如“else”中所示) 但是现在我需要用用户的首选子类别自定义返回,所以我要做的是为每个子类别查询n次,然后只添加范围。如果用户有5个子类别作为收藏夹,我不想查询5次db,但我不知道如何应用dinamic或 所以我的问题是,如何提高代码的性能 var posts = new List<Content>(); if (request.UserId != 0) { va

在这个场景中,我使用FindByMany进行查询(如果用户所在国家和类别匹配,则使用lambda并返回post)(如“else”中所示) 但是现在我需要用用户的首选子类别自定义返回,所以我要做的是为每个子类别查询n次,然后只添加范围。如果用户有5个子类别作为收藏夹,我不想查询5次db,但我不知道如何应用dinamic或

所以我的问题是,如何提高代码的性能

var posts = new List<Content>();
if (request.UserId != 0)
{
   var user = _userRepository.FindBy(u => u.Id == request.UserId);
   if (user != null && user.SubCategories.Any())
   {
      foreach (var temp in user.SubCategories.Select(subCategory => _contentRepository.FindManyBy(
         c =>
           c.Country.Id == country.Id && c.Category.Id == theCategory.Id &&
           c.SubCategory.Id == subCategory.Id).ToList()))
      {
         posts.AddRange(temp);
      }
   }
}
else
{
   posts = _contentRepository.FindManyBy(
           c => c.Country.Id == country.Id && c.Category.Id == theCategory.Id
      ).ToList();
}
var posts=newlist();
if(request.UserId!=0)
{
var user=\u userRepository.FindBy(u=>u.Id==request.UserId);
if(user!=null&&user.SubCategories.Any())
{
foreach(user.SubCategories.Select(subCategory=>\u contentRepository.FindManyBy中的变量temp(
c=>
c、 Country.Id==Country.Id&&c.Category.Id==theCategory.Id&&
c、 SubCategory.Id==SubCategory.Id).ToList())
{
posts.AddRange(temp);
}
}
}
其他的
{
posts=\u contentRepository.FindManyBy(
c=>c.Country.Id==Country.Id&&c.Category.Id==theCategory.Id
).ToList();
}

您是否可以将子类别整理成一个列表,然后在您的
中使用
thatlist.Contains()

您是否可以将子类别整理成一个列表,然后在
中使用
thatlist.Contains()

您可以通过一次查询获得用户的子类别,然后使用列表和
包含
方法来过滤相关帖子。
包含
方法受大多数LINQ查询提供的支持,应该转换为单个数据库查询

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);
 }

您可以通过一个查询获得用户的子类别,然后使用列表和
Contains
方法筛选相关帖子。
Contains
方法受大多数LINQ查询支持,应该转换为单个数据库查询

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);
 }

您可以使用或使用where子句为where子句构建表达式。

您可以使用或使用where子句为where子句构建表达式问题的核心在于,您强制执行每个项的查询,而不是动态构建查询。@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();
IEnumerable subcategorids=user.SubCategories.Select(x=>x.Id);
var posts=\u contentRepository.FindByMany(c=>c.Country.Id==Country.Id
&&c.Category.Id==类别Id
&&subcategorids.Contains(c.subcategorid)).ToList();

问题的核心是,您强制执行每个项的查询,而不是动态生成查询。@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();
IEnumerable subcategorids=user.SubCategories.Select(x=>x.Id);
var posts=\u contentRepository.FindByMany(c=>c.Country.Id==Country.Id
&&c.Category.Id==类别Id
&&subcategorids.Contains(c.subcategorid)).ToList();