2013-05-20 20 views
8

Używam linq do łączenia wielu tabel i pisania zapytań złożonych. Tutaj, gdy będę miał "0" jako dowolny parametr tj. CategoryId, GameId, LimitVariantId, to znaczy, że użytkownik wybrał "Wszystkie" z interfejsu.Operator potrójny w LINQ gdzie klauzula

My SQL kwerendy, gdy będę przechodzić parametr wartości większe niż '0' jest:

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) 

Kiedy mijam IDkategorii jak 0 następnie Moje zapytanie SQL będzie:

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) 

Tak Nie muszę uwzględniać tych pól w klauzuli where. Za to, że napisałem następujący 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(); 
    } 

Ale to zwróci wszystkie pola z mojej bazy danych. Więc czy ktoś może mi pomóc napisać te zapytania w LINQ z potrójnym warunkiem, który zwróci moje rekordy filtrowanych pól?

+0

Czy możesz dopracować swoje wymagania? –

+2

to operator trójskładnikowy, który uczyni to bardziej czytelnym? – Jodrell

Odpowiedz

4

z LINQ do SQL (z LINQ w ogóle) można programowo programowo dodać warunki Where, takie jak:

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

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

i tak dalej.

Poza tym, lepiej jest użyć „typ wnioskowania” (za pomocą słowa kluczowego var) zamiast dynamic, nie dostaniesz intellisense z dynamic

[Edytuj] LINQ do dostawcy SQL będzie grupowej wszystkie warunki Where przy tłumaczeniu na SQL

+0

Dzięki to jest dla mnie pomocne. – KomalJariwala

1

Nadal można wykonać tej kwerendy SQL, spróbuj coś takiego:

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:

zrobić to samo dla pozostałych parametrów:

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

Dzięki. ale potrzebuję zapytania w linq. – KomalJariwala

+1

Użyj tej samej zasady co powyższe zapytanie. Spróbuj zastąpić "CategoryId == 0? true: x.CategoryId == Identyfikator kategorii z '(CategoryId == 0 || x.CategoryId == CategoryId)'. Inne parametry też: – noobob

+0

@noobob, +1, '0' może nie być właściwą" inną "wartością, może być' null', ale ta zasada działa idealnie. –

0

Twój przykład jest bardzo skomplikowany, ale zasadniczo używasz linq do zbudowania zapytania.

var someIQueryableInProgress = ... ; 

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

Następnie należy ocenić, kiedy wszystkie warunki są spełnione i pozwolić usługodawcy wykonać pracę za Ciebie.