1

2つのテーブルを結合するLINQ式があります。別のブール値を条件付きでチェックしたい:( 以下の間にテキストがあることに注意してください*********

bool status = testfunc();

var List = 
    from t in Houses
    join k in Tbl_HouseOwner on t.HouseCode equals k.HouseCode
    where k.ReqCode== t.ReqCode 
    *********** if (status) { where k.Name.Contains(Name) } **********
    select new
    {
        ...
        name = k.Name,
        ...
    };
4

3 に答える 3

7

status次のように、条件をマスクするために使用できます。

where k.ReqCode == t.ReqCode && (!status || k.Name.Contains(Name))

statusisの場合false、OR||はすぐに成功し、AND&&は真になります(ORを評価する必要があると仮定すると、AND||の左側&&が真である必要があります)。一方、がのstatus場合、条件の評価を終了するには、を評価する必要があります。truek.Name.Contains(Name)

于 2012-07-10T04:12:39.627 に答える
3

dasblinkenlightの答え(正常に機能するはずです)の代替オプションは、プログラムでクエリを作成することです。この場合、結合の右側を効果的に変更しているので、次を使用できます。

IQueryable<Owner> owners = Tbl_HouseOwner;
if (status)
{
    owners = owners.Where(k => k.Name.Contains(Name));
}

それで:

var query = from t in Houses
            join k in owners on t.HouseCode equals k.HouseCode
            where k.ReqCode == t.ReqCode
            select new { ... };

どちらのアプローチが最適かは、シナリオによって異なります。さまざまなクエリフィルターを追加する場合は、プログラムで作成する方がわかりやすくなり、特定のクエリの最終的なSQLを理解しやすくなります。1回限りの場合、dasblinkenlightのアプローチはより単純です。

また、少なくともLINQ to Objectsでは、両方の列で結合する方が効率的であることに注意してください。

var query = from t in Houses
            join k in owners 
            on new { t.HouseCode, t.ReqCode } equals new { k.HouseCode, k.ReqCode }
            select new { ... };

SQLに変換するLINQのどのフレーバーでも、データベースまたはクエリ変換によってこれが最適化されることを期待しています。

于 2012-07-10T04:18:27.407 に答える
1

私はそれをこのようにします:

        IQueryable<X> r = from x in Xs
                                  where (x.Status == "Active")
                                  select x;
        if(withFlagA) {
            r = r.Where(o => o.FlagA == true);
        }

これをあなたの例に合わせるために、最初にこれを行うことができます:

 IQueryable<YourOwnerType> filteredOwners = Tbl_HouseOwner;
 if( status ) {
     filteredOwners = filteredOwners.Where( o => o.Name.Contains(Name) );
 }

次に、 Tbl_HouseOwnerfilteredOwnersに置き換えます。

var List = 
from t in Houses
join k in filteredOwners on t.HouseCode equals k.HouseCode
where k.ReqCode== t.ReqCode 
//Nothing here 
select new
{
    ...
    name = k.Name,
    ...
};

さて、あなたはこれを知っているかもしれませんが、ここでのポイントは、最初の.Whereがデータベースに「到達しない」ということです。クエリは、列挙を開始するか(foreachなど)、 ToList()First()FirstOrDefault()などのメソッドを呼び出すまで実行されません。これは、 .Wheresを選択した後、必要に応じて呼び出すことができることを意味し、最終的なクエリは引き続き効率的です。

于 2012-07-10T07:17:03.590 に答える