2013-02-16 34 views
1

我正在努力处理在asp.net QueryString方法中工作的linq查询。我尝试了各种各样的东西,但仍然没有把它做好。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; 
} 

谁能帮助? 谢谢。

回答

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; 
} 
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命令不延迟,这可能不是在这种情况下,可取的。

+0

我发送了很多。任何调用数据库。它当然可以翻译。你试过了吗?另外 - 加入 - >独特是不好的... – 2013-02-17 00:14:21

+0

谢谢大卫。由于我没有尝试过,我的印象是每个'.Any'都有一个数据库查询。幸运的是,LINQ比这更聪明。 – 2013-02-17 06:27:01

相关问题