私はlinqを使って複数のテーブルを結合し、複雑なクエリを書いています。ここでパラメータとして「0」を指定すると、CategoryId
、GameId
、LimitVariantId
となります。これは、ユーザーがインターフェイスから「すべて」を選択したことを意味します。私は、パラメータが「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でこれらのクエリを書くのを助けることができますか?
あなたの要件を詳しく教えてください。 –
は、これをより読みやすくするための三項演算子ですか? – Jodrell