このアプリケーションでは、何百ものクエリに影響を与える新しい機能が導入されました。ライセンスが有効かどうかを示すために、非常に複雑な方法で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
);
}
のようなものにするために機能を変更する必要があります、私はあなたが何であるかを理解します提案するが、それは私の問題には関係しない。 Entity.Entity.EntityをLINQクエリで使用しても、これは引き続き単一のSQLクエリを実行します。 – Germstorm