2013-05-20 3 views
8

Я использую linq для объединения нескольких таблиц и записи сложного запроса. Здесь, когда i будет иметь «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) 

Когда я передам CategoryId, как 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, вы не получите IntelliSense с 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:

сделать то же самое для остальных параметров:

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

Затем оцените, когда применяются все ваши условия, и пусть поставщик выполняет эту работу за вас.

Смежные вопросы