c# - 用可重用的方法替换 LINQ to SQL 查询的一部分

标签 c# linq linq-to-sql

我们在我们的应用程序中引入了一项新功能,它会影响数百个查询。我们必须以一种非常复杂的方式设置一个 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
        );
}

最佳答案

如果您在查询之前设置了 DataContextDataLoadOptions 并设置正确,您应该避免子选择。类似这样的东西:

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

Tha 是默认行为(延迟加载实体)。您可以搜索“linq to sql eagerloading”以获取更多信息

关于c# - 用可重用的方法替换 LINQ to SQL 查询的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43271778/

相关文章:

c# - 带有 Func() 参数的 ASP.NET Core 日志记录

c# - 在枚举值上使用 Where

c# - 什么会导致 EntityCommandDefinition.ExecuteStoreCommands 中的 EntityCommandExecutionException?

c# - Entity Framework 6 MySQL - 与 MySQL 引擎的性能差异

c# - LINQ 性能与 Dictionary<K,V>

c# - 使用 LINQ to SQL 时避免连接超时的最佳实践

.net - 如何创建 LINQ to SQL 事务?

c# - 如何导航到 UWP 中的参数化构造函数?

c# - 从用户定义的类创建 SQL Server 表

c# - ajax 中的 get 请求到 Controller 操作不起作用?