1

我正在努力处理在 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=Football, 2=golf, 3=cricket) 等值。

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

但是这个 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;
}

任何人都可以帮忙吗?谢谢。

4

2 回答 2

2

由于返回值,您遇到错误

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;
}
于 2013-02-16T22:07:43.420 回答
0

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

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

The Any command is not deferred, which probably isn't desirable in this case.

于 2013-02-16T23:41:08.830 回答