我正在使用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;
}
有人可以帮忙吗? 感谢。
答案 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
命令不会延迟,在这种情况下可能不可取。