如何查询ICollection?

tet*_*ett 4 c# linq collections

我有两个模型,其中两个都包含ICollection对象,如下所示:

public class Business : ApplicationUser
{
    ...
    public virtual ICollection<Subcategory> Subcategories { get; set; }
    ...
}

public class Request
{
    ....
    public virtual ICollection<Subcategory> Subcategories { get; set; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想查询业务并获得其子类别与请求中的子类别匹配的业务(即使一个匹配就足够了).我有类似的东西,我只是作为样本编写,当然它不起作用(请求类型为Request):

foreach (var subcategory in request.Subcategories)
{
    var businesses = db.Users
        .OfType<Business>()
        .Where(b => b.Subcategories
            .Where(s => s.SubcategoryName == subcategory.SubcategoryName));
}
Run Code Online (Sandbox Code Playgroud)

因此,举例来说,假设我们有两个企业,第一个有足球和篮球作为子类别,第二个有篮球和网球.然后,假设我们的用户选择了足球和网球子类别,所以我的查询应该返回两个商家,因为第一个包括足球,第二个包括网球.

因此,并非每个子类别都应该匹配,即使一个匹配也足以接受业务.我怎样才能实现它?如果你能提供代码,我会很高兴.

这里也是我的子类别模型,如果你需要它:

public class Subcategory
{
    public int SubcategoryID { get; set; }

    public string SubcategoryName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*vey 7

查看Linq方法的签名.特别是,哪里

Enumerable.Where<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)
Run Code Online (Sandbox Code Playgroud)

期望一个返回布尔值的谓词. Where返回一个集合,因此您无法将其插入到期望Func返回布尔值的Where子句中; 那不行.

您可能需要的是这样的:

var businesses = db.Users.OfType<Business>()
    .Where(b => b.Subcategories
    .Any(s => s.SubcategoryName == subcategory.SubcategoryName));
Run Code Online (Sandbox Code Playgroud)

注意使用Any.Any返回一个boolean值,指示是否找到与您的谓词匹配的记录s => s.SubcategoryName == subcategory.SubcategoryName