首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在导航属性中搜索

在导航属性中搜索
EN

Stack Overflow用户
提问于 2012-09-16 09:31:10
回答 2查看 121关注 0票数 0

我在ASP.NET MVC4中使用代码优先的方法创建了我的应用程序。

我有三个实体。即“公司”、“服务”和"ServiceFeature":

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

    [Required]
    public string Name { get; set; }

    [Required]
    public string Description { get; set; }

    public virtual Service SuppliedService { get; set; }

}

public class Service
{
    public int ServiceID { get; set; }

    [Required]
    public string Name { get; set; }

    public virtual ICollection<ServiceFeature> ServiceFeatures { get; set; }

}    

public class ServiceFeature
{
    public int ServiceFeatureID { get; set; }

    [Required]
    public string Name { get; set; }


}

我有一个搜索表单,它包含了所有ServiceFeatures的复选框。用户将选中复选框并获取使用所选ServiceFeatures提供服务的公司的结果。

我通过下面的服务获得了公司列表,但是我被困在如何在where子句中包含所选的ServiceFeatures (使用for循环的动态LINQ?)

代码语言:javascript
复制
var searchResults = _companyService.GetCompanies();
EN

回答 2

Stack Overflow用户

发布于 2012-09-16 15:49:59

假设您有一个包含所选功能的ID的集合,名为requested,并假设您希望公司提供包含所有所选功能的服务,例如,您可以这样做:

代码语言:javascript
复制
var q = from c in searchResults
        let sf = c.SuppliedService.ServiceFeatures
                                  .Select(f => f.ServiceFeatureID)
                                  .Intersect(requested)
        where sf.Count() == requested.Count()
        select c;
票数 0
EN

Stack Overflow用户

发布于 2012-09-17 05:25:54

在类似的情况下,我更喜欢一种比使用Intersect的linq查询更复杂的方法。Intersect可能会产生嵌套很深的可怕查询,因为包含要相交的ID值的列表是由SELECTUNION命令为列表中的每个Id构建的。当Id的数量很少(我假设在您的情况下是真的)时,这不是问题,但是对于更大的数量,它可能会抛出SQL异常。

所以这是我更喜欢的:

代码语言:javascript
复制
var q = context.Companies.AsQueryable();

foreach(int i in featureIds)
{
    int j = i; // prevent modified closure.
    q = q.Where(c => c.SuppliedService.ServiceFeatures.Any(f => f.Id == j));
}

var result = q.ToList();

它使用多个WHERE EXISTS子句构建一个查询。这是非常有效的,因为每个EXISTS都会查找(而不是扫描) ServiceFeature的主索引。除此之外,INTERSECT是一个隐式的DISTINCT

好吧,只是想指出这一点。如上所述,在记录数量较少的情况下,您不会注意到任何差异。所以拿最适合你的吧。

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

https://stackoverflow.com/questions/12443778

复制
相关文章

相似问题

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