2013-05-20 34 views
8

我正在使用linq來連接多個表並編寫複雜查詢。在這裏,當我將'0'作爲任何參數,即CategoryId,GameId,LimitVariantId,這意味着用戶從界面選擇了「全部」。LINQ中的三元運算符,其中子句

我的SQL查詢,當我將通過參數值比 '0' 更大的是:

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

但是,這將返回從我的數據庫中的所有字段。所以任何人都可以幫助我在LINQ中用三元條件寫這些查詢,這將返回我過濾的字段的記錄?

+0

您能否詳細說明您的要求? –

+2

是一個三元運算符將使這更具可讀性? – Jodrell

回答

4

使用LINQ到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); 
} 

等等。

此外,最好是用「類型推斷」(使用var關鍵字),而不是dynamic,你不會用智能感知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) 

編輯:

執行相同的其餘參數:

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)'。其他參數 – noobob

+0

@noobob,+1,'0'可能不是正確的「其他」值,它可能是'null',但是這個原理很完美。 –

0

你的例子非常複雜,但本質上你使用linq來建立一個查詢。

var someIQueryableInProgress = ... ; 

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

然後評估何時應用所有條件並讓提供商爲您完成工作。