首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查询ICollection?

如何查询ICollection?
EN

Stack Overflow用户
提问于 2014-09-09 00:12:16
回答 2查看 16.1K关注 0票数 4

我有两个模型,它们都包含一个ICollection对象,如下所示:

代码语言:javascript
复制
public class Business : ApplicationUser
{
    ...
    public virtual ICollection<Subcategory> Subcategories { get; set; }
    ...
}

public class Request
{
    ....
    public virtual ICollection<Subcategory> Subcategories { get; set; }
    ...
}

我想要查询业务,并得到其子类别与请求中的匹配的业务(即使一个匹配就足够了)。我有这样的东西,我只是写了一个样本,当然它不能工作(request的类型是Request):

代码语言:javascript
复制
foreach (var subcategory in request.Subcategories)
{
    var businesses = db.Users
        .OfType<Business>()
        .Where(b => b.Subcategories
            .Where(s => s.SubcategoryName == subcategory.SubcategoryName));
}

例如,假设我们有两个业务,第一个业务的子类别是足球和篮球,第二个业务的子类别是篮球和网球。然后,假设我们的用户同时选择了足球和网球子类别,所以我的查询应该返回这两个业务,因为第一个包括足球,第二个包括网球。

因此,不是每个子类别都应该匹配,即使是一个匹配也足以接受业务作为结果。我怎样才能做到这一点?如果你能提供代码,我会很高兴。

这也是我的子类别模型,以防你需要它:

代码语言:javascript
复制
public class Subcategory
{
    public int SubcategoryID { get; set; }

    public string SubcategoryName { get; set; }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-09-09 00:19:23

看看你的Linq方法的签名。特别是,Where

代码语言:javascript
复制
Enumerable.Where<TSource> Method (IEnumerable<TSource>, Func<TSource, Boolean>)

需要返回布尔值的谓词。Where返回一个集合,所以您不能将其插入Where子句中,因为它需要一个返回布尔值的Func;这是行不通的。

你可能需要这样的东西:

代码语言:javascript
复制
var businesses = db.Users.OfType<Business>()
    .Where(b => b.Subcategories
    .Any(s => s.SubcategoryName == subcategory.SubcategoryName));

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

票数 9
EN

Stack Overflow用户

发布于 2014-09-09 00:18:06

我会这样做:

代码语言:javascript
复制
var businesses = db.Users
    .OfType<Business>()
    .Where(b => b.Subcategories.Intersect(request.Subcategories)
    .Any());

详细分析一下:

代码语言:javascript
复制
b.Subcategories.Intersect(request.Subcategories);

将返回存在于b.Subcategories和request.Subcategories中的这些类别的集合。

因此

代码语言:javascript
复制
b.Subcategories.Intersect(request.Subcategories).Any()

如果两者中都存在任何类别,则返回true,如果不存在,则返回false。

所以最后:

代码语言:javascript
复制
db.Users.OfType<Business>()
        .Where(b => b.Subcategories.Intersect(request.Subcategories).Any());

将返回前面语句返回true的任何业务,即具有与请求子类别匹配的子类别的任何业务。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25728556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档