我们在我们的应用程序中引入了一项新功能,它会影响数百个查询。我们必须以一种非常复杂的方式设置一个 bool
字段来指示许可证是否有效。
我想创建一个方法来返回此 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
);
}
最佳答案
如果您在查询之前设置了 DataContext
的 DataLoadOptions
并设置正确,您应该避免子选择。类似这样的东西:
db.LoadOptions.LoadWith<Devices>(p => p.License);
Tha 是默认行为(延迟加载实体)。您可以搜索“linq to sql eagerloading”以获取更多信息
关于c# - 用可重用的方法替换 LINQ to SQL 查询的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43271778/