我們在應用程序中引入了一項新功能,該功能會影響數百個查詢。我們必須以非常複雜的方式設置bool
字段以指示許可證是否有效。用可重用方法替換部分LINQ to SQL查詢
我想創建一個方法來返回這個bool
值,我想在每個查詢中使用它。問題是,如果我按照下面所示的方式使用它,它會爲每個結果執行一個單獨的查詢。
如何使用Expression
將其編譯爲SQL並作爲單個查詢執行?
原來的查詢,需要改進
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)
};
在上面的查詢的方法,使用:
public static Func<Device, bool> IsLicenseEnabledAndValid(bool checkForLicense)
{
return result => !checkForLicense ||
result.License != null && (
!result.License.TrialStarted
// && 12+ licensing rules
);
}
我明白你是什麼暗示,但它不涉及我的問題。即使我在LINQ查詢中使用Entity.Entity.Entity,它仍將執行單個SQL查詢。 – Germstorm