2017-04-07 3 views
2

このアプリケーションでは、何百ものクエリに影響を与える新しい機能が導入されました。ライセンスが有効かどうかを示すために、非常に複雑な方法でboolフィールドを設定する必要があります。LINQ to SQLクエリの一部を再利用可能なメソッドに置き換えます

このbool値を返すメソッドを作成したいと思います。すべてのクエリでこのメソッドを使用したいと思います。問題は、以下のように使用すると、結果ごとに個別のクエリが実行されることです。

ExpressionをSQLにコンパイルして1つのクエリとして実行する方法を教えてください。改善の必要がある

オリジナルのクエリは、

IQueryable<DeviceMinimal> devices = 
    from device in db.Devices 
    where device.AccountId = accountId 

    select new DeviceMinimal 
    { 
     Id = device.Id, 
     Name = device.Name, 
     LicenseIsValid = !checkForLicense || 
      device.License != null && (
       !device.License.TrialStarted 
       // && 12+ licensing rules 
      ) 
    }; 

checkForLicenseライセンスがチェックする必要がないことを示しているboolです。場合によっては使用され、考慮する必要があります。

問題を解決するが、

IQueryable<DeviceMinimal> devices = 
    from device in db.Devices 
    where device.AccountId = accountId 

    select new DeviceMinimal 
    { 
     Id = device.Id, 
     Name = device.Name, 
     LicenseIsValid = 
      LicenseHelper.IsLicenseValid(checkForLicense).Invoke(device) 
    }; 

各デバイスごとに上記のクエリ内のメソッドの使用別のクエリを誘発コード、:あなたはのDataLoadOptionsを設定した場合

public static Func<Device, bool> IsLicenseEnabledAndValid(bool checkForLicense) 
{ 
    return result => !checkForLicense ||     
     result.License != null && (
      !result.License.TrialStarted 
      // && 12+ licensing rules 
     ); 
} 

答えて

0

をクエリの前にDataContextとそれらを正しく設定すると、副選択を避けるべきです。これと似たようなもの:

db.LoadOptions.LoadWith<Devices>(p => p.License); 

Thaがデフォルト動作(エンティティの遅延読み込み)です。あなたは 'linq to sql eagerloading'を検索するための情報を得ることができます

+0

のようなものにするために機能を変更する必要があります、私はあなたが何であるかを理解します提案するが、それは私の問題には関係しない。 Entity.Entity.EntityをLINQクエリで使用しても、これは引き続き単一のSQLクエリを実行します。 – Germstorm

0

動作するかどうかわかりませんが、メインクエリでライセンスにアクセスしようとしましたか?言い換えれば のようなもの:

Queryable<DeviceMinimal> devices = 
    from device in db.Devices 
    where device.AccountId = accountId 

    select new DeviceMinimal 
    { 
     Id = device.Id, 
     Name = device.Name, 
     LicenseIsValid = 
     LicenseHelper.IsLicenseEnabledAndValid(checkForLicense).Invoke(device.Licence) 
    }; 

public static Func<License, bool> IsLicenseEnabledAndValid(bool checkForLicense) 
{ 
    return result => !checkForLicense || 
     result != null && (
     !result.TrialStarted 
     // && 12+ licensing rules 
    ); 
} 

あなたの方法では、デバイスとライセンスの両方にアクセスする必要がある場合、あなたは

public static Func<Device, License, bool> IsLicenseEnabledAndValid(bool checkForLicense) 
{ 
    return (device, licence) => 
    ... 
} 
関連する問題