2011-07-06 12 views
2

の多くを回避するために、どのように私はこのような状況を持っている:匿名型を使用する - コード

if (condition){ 
    var variable = (from el in ....) //linq to sql query 
} 
else{ 
    var variable = (from el in ....) //linq to sql query 
} 

// code where i can`t use the variable 

私は両方の条件でコードをコピーしないようにしたいです。

var getHistoryTips = (from el in objDC.tickets 
         where el.typeOfGame == cANDu[0] 
         && el.username == Membership.GetUser(cANDu[1]).ProviderUserKey.ToString() 
         select new { el.AllGamesTickets, el.WGamesTickets}).FirstOrDefault(); 


var getHistoryTips = (from el in objDC.tickets 
         where el.typeOfGame == cANDu[0] 
         && el.results != null 
         && el.username == Membership.GetUser(cANDu[1]).ProviderUserKey.ToString() 
         select new { el.AllGamesTickets, el.WGamesTickets}).FirstOrDefault(); 
+4

どちらの場合でもクエリはどのように見えますか? – BoltClock

+3

コピーを避けたいのですか?編集:今あなたのクエリを参照してください。彼らは同じように見えます。あなたの条件の結果が同じ場合、なぜ条件が必要なのでしょうか? –

+1

あなたのコピーを避けようとしていることのより良い考えが必要です。 –

答えて

8

の3つのオプション:変数を入力する

まず、あなたが「例」を使用することができますので、あなたのコードは次のようになります演算子:

var variable = condition ? ... first query ... 
         : ... second query ... 

第3に、代わりに合成を使用してクエリを作成できます。たとえば、唯一の違いは順序であれば、あなたができる:

var firstPart = ...; 

var secondPart = condition ? query.OrderBy(...) : query.OrderByDescending(...); 

var query = secondPart.Select(...); 

はEDIT:今、あなたは一例を与えてくれた、私たちはこのコンクリートを作ることができます。

string username = membership.GetUser(cANDu[1]).ProviderUserKey.ToString(); 
var query = objDC.tickets 
       .Where(el => el.typeOfGame == cANDu[0] && 
           el.username == username); 

if (condition) 
{ 
    query = query.Where(el => el.results != null); 
} 

var result = query.Select(el => new { el.AllGamesTickets, el.WGamesTickets}) 
        .FirstOrDefault(); 
+0

彼の最新のコメントを見る:" if "と" else "に" code "を入れないようにしたい、" –

+1

@ 0A0D:それは私の3番目のオプションが与えるもので、今具体的な例がある。 –

+0

@Jon Skeetクエリで2つの異なるテーブルでこれを行う可能性はありますか? – gormit

2

あなたは三項演算子を使用することができるかもしれない:

var variable = (condition) ? (from el in...) : (from el in...); 

(コロンの前)最初のLINQツーSQL文が真の場合とLINQからSQLへの後でコロンは偽の場合です。

// Same anonymous type properties and types as later: 
var variable = Enumerable.Repeat(0, new { ... }); 

if (condition) { 
    variable = ...; 
} else { 
    variable = ...; 
} 

また、あなたが条件を使用することができます: - :

var getHistoryTips = (condition) ? (from el in objDC.tickets 
            where el.typeOfGame == cANDu[0] 
            && el.username == Membership.GetUser(cANDu[1]).ProviderUserKey.ToString() 
            select new { el.AllGamesTickets, el.WGamesTickets}).FirstOrDefault() : 
            (from el in objDC.tickets 
            where el.typeOfGame == cANDu[0] 
            && el.results != null 
            && el.username == Membership.GetUser(cANDu[1]).ProviderUserKey.ToString() 
            select new { el.AllGamesTickets, el.WGamesTickets}).FirstOrDefault(); 
+0

彼はそれを2回入力しないようにしたいと考えています(例: 'el.results!= null ") –

1

にあなたの状態を使用してくださいwhere句で自身を照会します。

あなたは何かのように、あなたが求めている

var variable = (from el in .... where (condition && trueBlockCondition) || (!condition && falseBlockCondition) 
1

機能が拡張メソッドの代わりに、LINQの構文を使用して実装することができますを記述する必要があります。クエリが複雑化した場合

var source = objDC.tickets.Where(el => 
    el.typeOfGame == cANDu[0] 
    && el.username == Membership.GetUser(cANDu[1]).ProviderUserKey.ToString()); 

if(condition) 
    source = source.Where(el => el.results != null); 

var getHistoryTips = source 
    .Select(el => new { el.AllGamesTickets, el.WGamesTickets})) 
    .FirstOrDefault(); 

、オプションとして、セレクタがエクスプレッション機能を介して実行することができます。

は、ここでの例です。

Expression<Func<ObjDCType, ShallowObjDCType>> selector = 
    (el) => new ShallowObjDC{ el.AllGamesTickets, el.WGamesTickets}); 

var getHistoryTips = source.Select(selector).FirstOrDefault(); 

このテクニックはあなたに他の関数内ヨーヨーパスセレクタを許可する、物事はより複雑になっている場合には、しかし、それは追加のクラスを定義したり、動的な使用、代わりに匿名クラスでする必要があります。これは、ORM(LINQ/EF)は、データベースからすべてのオブジェクトを引っ張ることになりますので、あなたは、式なしのFuncを使用することはできません

は注意、。

関連する問題