Linq查询选择一个项目,并在集合中包含参数

时间:2013-02-16 22:04:21

标签: c# asp.net linq

我正在使用asp.net QueryString方法中的linq查询。我尝试了各种各样的东西,但仍然没有完全正确。

我的模特是:

public class SportType
{
    public int SportTypeID {get; set;}
    public string SportTypeName {get; set;}
}

public class Company
{
    public int CompanyID {get; set;}
    public string Name {get; set;}
    public ICollection<SportType> sportTypes {get; set;}
}

数据库中有一个运动类型表,其值如(1 =足球,2 =高尔夫,3 =板球)等。

公司可以没有/一个/多个运动类型。 我想选择所有具有特定运动类型的公司。

但是这个linq查询给出了编译器错误:

参数1:无法从System.Linq.IQueryable转换为MyNamespace.SportType

public IQueryable<Company> GetCompanies([QueryString("sportTypeID")] int? sportTypeID)
{
    var db = new MyDatabaseContext();
    IQueryable<Company>query = db.Companies;
    if (sportTypeID.HasValue && sportTypeID>0)
    {
        query = query.Where(theCompany => theCompany.sportTypes.Contains(db.SportTypes.Select(sp => sp.SportTypeID == sportTypeID)));
    }
    return query;
}

有人可以帮忙吗? 感谢。

2 个答案:

答案 0 :(得分:1)

由于返回值

,您遇到错误
db.SportTypes.Select(sp => sp.SportTypeID == sportTypeID)

线。它返回SportType实例的集合(可能有很多值),而Contains方法只需要一个SportyType实例。 试试这个:

public IQueryable<Company> GetCompanies([QueryString("sportTypeID")] int sportTypeID)
{
    var db = new MyDatabaseContext();
    IQueryable<Company>query = db.Companies;
    if (sportTypeID.HasValue && sportTypeID>0)
    {
        query = query.Where(theCompany => theCompany.sportTypes.Any(stype => stype.SportTypeID == sportTypeID)));
    }
    return query;
}

答案 1 :(得分:0)

这应该比Blablablaster的回答更有效:

public IQueryable<Company> GetCompanies([QueryString("sportTypeID")] int? sportTypeID)
{
    var db = new MyDatabaseContext();
    IQueryable<Company>query = db.Companies;
    if (sportTypeID.HasValue && sportTypeID>0)
    {
        return query.Join(db.SportTypes, o => o.CompanyID, i => i.CompanyID, (o, i) => new {
                        Company = o,
                        HasSportType = i.SportTypeID == sportTypeID
                    })
                    .Where(x => x.HasSportType)
                    .Select(x => x.Company)
                    .Distinct();
    }
    return query;
}

Any命令不会延迟,在这种情况下可能不可取。