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=フットボール、2=ゴルフ、3=クリケット) などの値を持つスポーツ タイプ テーブルがあります。

1 つの会社は、0、1、または複数のスポーツ タイプを持つことができます。特定のスポーツ タイプを持つすべての企業を選択したいと考えています。

しかし、この 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

これは 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場合、コマンドは遅延されません。これはおそらく望ましくありません。

于 2013-02-16T23:41:08.830 に答える