2013-05-20 41 views
8

私はlinqを使って複数のテーブルを結合し、複雑なクエリを書いています。ここでパラメータとして「0」を指定すると、CategoryIdGameIdLimitVariantIdとなります。これは、ユーザーがインターフェイスから「すべて」を選択したことを意味します。私は、パラメータが「0」より大きい値渡しますLINQの3項演算子where句

私のSQLクエリは、次のとおりです。

select * from dbo.GameCombinations gc 
inner join dbo.StakeBuyInByStakeCategories sbsc 
on sbsc.StakeBuyInByStakeCategoryId = gc.StakeBuyInByStakeCategoryId 
inner join dbo.GameTables gt 
on gc.GameCombinationId = gt.GameCombinationId 
where gc.CurrencyId=1 and gc.GameTypeId=2 
and sbsc.StakeBuyInId=gt.BuyIn 
and gc.CategoryId=4 
and gc.GameId=7 
and gc.LimitVariantId=23 
and gc.StakeCategoryId in (3,5,6) 

私は0として区分に合格する場合は[マイSQLクエリは次のようになります。

だから、
select * from dbo.GameCombinations gc 
inner join dbo.StakeBuyInByStakeCategories sbsc 
on sbsc.StakeBuyInByStakeCategoryId = gc.StakeBuyInByStakeCategoryId 
inner join dbo.GameTables gt 
on gc.GameCombinationId = gt.GameCombinationId 
where gc.CurrencyId=1 and gc.GameTypeId=2 
and sbsc.StakeBuyInId=gt.BuyIn 
--and gc.CategoryId=4 
and gc.GameId=7 
and gc.LimitVariantId=23 
and gc.StakeCategoryId in (3,5,6) 

私はwhere句にそのフィールドを含める必要はありません。そのために、私は次のLINQを書いていました:

ProviderDB db = new ProviderDB(); 
try 
{ 
    IQueryable<dynamic> query; 

    if (StakeCategoryIdsByStakeBuyIn != null) 
    { 
     query = (from gc in db.GameCombinations.Where(x => x.CurrencyId == CurrencyId && x.GameTypeId == GameTypeId 
          && CategoryId <= 0 ? true : x.CategoryId == CategoryId 
          && GameId <= 0 ? true : x.GameId == GameId 
          && LimitVariantId <= 0 ? true : x.LimitVariantId == LimitVariantId 
          && StakeCategoryIdsByStakeBuyIn.Contains(x.StakeCategoryId) 
         ) 
       join sbsc in db.StakeBuyInByStakeCategories 
       on gc.StakeBuyInByStakeCategoryId equals sbsc.StakeBuyInByStakeCategoryId 
       join gt in db.GameTables 
       on gc.GameCombinationId equals gt.GameCombinationId 
       join gx in db.Games 
       on gc.GameId equals gx.GameId into joined 
       from gx in joined.DefaultIfEmpty() 
       where gt.BuyIn == sbsc.StakeBuyInId 
       select new 
       { 
        GameTableId = gt.GameTableId, 
        Description = gt.Description, 
        BuyIn = gt.BuyIn, 
        Table = gx.GameName, 
        MaxAllowPlayer = gt.MaxAllowPlayer 
       }).Distinct(); 
    } 
    else 
    { 
     query = (from gc in db.GameCombinations.Where(x => x.CurrencyId == CurrencyId && x.GameTypeId == GameTypeId 
           && CategoryId == 0 ? true : x.CategoryId == CategoryId 
           && GameId == 0 ? true : x.GameId == GameId 
           && LimitVariantId == 0 ? true : x.LimitVariantId == LimitVariantId 
           && StakeCategoryIdsByStakeBuyIn == null 
         ) 
       join sbsc in db.StakeBuyInByStakeCategories 
       on gc.StakeBuyInByStakeCategoryId equals sbsc.StakeBuyInByStakeCategoryId 
       join gt in db.GameTables 
       on gc.GameCombinationId equals gt.GameCombinationId 
       join sb in db.StakeBuyIns 
       on gt.BuyIn equals sb.StakeBuyInId 
       join gx in db.Games 
       on gc.GameId equals gx.GameId into joined 
       from gx in joined.DefaultIfEmpty() 
       where gt.BuyIn == sbsc.StakeBuyInId 
       select new 
       { 
        GameTableId = gt.GameTableId, 
        Description = gt.Description, 
        BuyIn = sb.StakeBuyInValue, 
        Table = gx.GameName, 
        MaxAllowPlayer = gt.MaxAllowPlayer 
       }).Distinct(); 
    } 

しかし、これは私のデータベースからすべてのフィールドを返します。だから、私はフィルタリングされたフィールドのレコードを返す3値条件でLINQでこれらのクエリを書くのを助けることができますか?

+0

あなたの要件を詳しく教えてください。 –

+2

は、これをより読みやすくするための三項演算子ですか? – Jodrell

答えて

4

にしますSQL(一般的にはLINQで)Where条件をプログラムで追加することができます。

var query = db.GameCombinations.Where(x => x.CurrencyId == CurrencyId && x.GameTypeId == GameTypeId); 

if (CategoryId > 0) 
{ 
    query = query.Where(x => x.CategoryId == CategoryId); 
} 

など。

また、それはdynamicの代わりに(varキーワードを使用して)「型推論」を使用することをお勧めします、あなたはdynamic

[編集] のLINQにSQLプロバイダ意志グループとインテリセンス得ることはありませんすべてWhere SQLへの翻訳時の条件

+0

ありがとうございました。 – KomalJariwala

1

あなたはまだのような何かしようと、SQLでこのクエリを実行することができます。

select * from dbo.GameCombinations gc 
inner join dbo.StakeBuyInByStakeCategories sbsc 
on sbsc.StakeBuyInByStakeCategoryId = gc.StakeBuyInByStakeCategoryId 
inner join dbo.GameTables gt 
on gc.GameCombinationId = gt.GameCombinationId 
where gc.CurrencyId=1 and gc.GameTypeId=2 
and sbsc.StakeBuyInId=gt.BuyIn 
and (0 = categoryParameter OR gc.CategoryId=categoryParameter) //Pass 0 to take all categories 
and gc.GameId=7 
and gc.LimitVariantId=23 
and gc.StakeCategoryId in (3,5,6) 

EDIT:

は、残りのパラメータのために同じことを行いますLINQのでは

ProviderDB db = new ProviderDB(); 

       try 
       { 
        IQueryable<dynamic> query; 

        if (StakeCategoryIdsByStakeBuyIn != null) 
        { 
         query = (from gc in db.GameCombinations.Where(x => x.CurrencyId == CurrencyId && x.GameTypeId == GameTypeId 
              && (CategoryId == 0 || x.CategoryId == CategoryId) 
              && (GameId == 0 || x.GameId == GameId) 
              && (LimitVariantId == 0 || x.LimitVariantId == LimitVariantId) 
              && StakeCategoryIdsByStakeBuyIn.Contains(x.StakeCategoryId) 
             ) 
           join sbsc in db.StakeBuyInByStakeCategories 
           on gc.StakeBuyInByStakeCategoryId equals sbsc.StakeBuyInByStakeCategoryId 
           join gt in db.GameTables 
           on gc.GameCombinationId equals gt.GameCombinationId 
           join gx in db.Games 
           on gc.GameId equals gx.GameId into joined 
           from gx in joined.DefaultIfEmpty() 
           where gt.BuyIn == sbsc.StakeBuyInId 
           select new 
           { 
            GameTableId = gt.GameTableId, 
            Description = gt.Description, 
            BuyIn = gt.BuyIn, 
            Table = gx.GameName, 
            MaxAllowPlayer = gt.MaxAllowPlayer 
           }).Distinct(); 
        } 
      } 
+1

ありがとうございます。しかし、私はlinqでクエリが必要です。 – KomalJariwala

+1

上記のクエリと同じ原則を使用します。 'CategoryId == 0? true:x.CategoryId == CategoryId'を '(CategoryId == 0 || x.CategoryId == CategoryId)'に置き換えます。他のパラメータtoo – noobob

+0

@noobob、+1、 '0'は正しい" other "値ではないかもしれませんが、' null'かもしれませんが、この原則は完璧に働きます。 –

0

あなたの例は非常に複雑ですが、基本的にはlinqを使用してクエリを作成しています。

var someIQueryableInProgress = ... ; 

if (categoryId != 0) 
{ 
    someIQueryableInProgress = someIQueryableInProgress 
     .Where(s => s.categoryId = categoryId) 
} 

次に、すべての条件が適用されたときに評価し、プロバイダがあなたに代わって作業をさせるようにします。