c# - 优化具有外键访问的 LINQ to SQL 语句

标签 c# sql-server linq optimization

我有以下数据库图表:

每个Product都使用LanguageKey来确定其名称,并且每个LanguageKey都有多个包含值的LanguageValue记录对于每种语言。

enter image description here

现在在我的 Controller 中,我想将我的 Product 实体选择到 ViewModel 对象中,因此我的语句如下所示:

 var model = new ProductListViewModel()
        {
            Products = products
                .Select(q => new ProductViewModel()
                {
                    ID = q.ID,
                    Name = q.LanguageKey.LanguageValues.FirstOrDefault(p => p.LanguageID == this.CurrentLanguage.ID && p.Active).Value,
                    Code = q.Code,

                    // Other code

简而言之,我已经有了所需的语言 ID,并且我需要获取准确的值。然而,当查看 VS 的诊断工具时,当执行查询树时(当我在 View 中调用 foreach 语句时),我的应用程序执行了多个 SELECT 语句,每个语句对应一个 LanguageValue,如下所示:

"SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[Active] AS [Active]
    FROM [dbo].[LanguageKey] AS [Extent1]
    WHERE [Extent1].[ID] = @EntityKeyValue1"

"SELECT 
    [Extent1].[ID] AS [ID], 
    [Extent1].[LanguageKeyID] AS [LanguageKeyID], 
    [Extent1].[LanguageID] AS [LanguageID], 
    [Extent1].[Value] AS [Value], 
    [Extent1].[Active] AS [Active]
    FROM [dbo].[LanguageValue] AS [Extent1]
    WHERE [Extent1].[LanguageKeyID] = @EntityKeyValue1"

是因为我使用的是FirstOrDefault()吗?有没有更好的方法来处理这个问题,因为我的应用程序在过滤后经常会处理大约 1k 条记录。

P.s:我还想知道为什么编译的查询中没有 Active 谓词。

编辑:这就是我获取products的方式(Context是我的DbContext,该函数位于ProductService类内部,productService是它的实例):

    public IEnumerable<Product> GetAllActiveProducts()
    {
        return this.Context.Products
            .Where(q => q.Active);
    }

    var products = productService.GetAllActiveProducts();

最佳答案

您的GetAllActiveProducts()应该返回IQueryable<Product> ,不是IEnumerable<Product> 。通过返回IEnumerable<Product> ,您实际上是强制在客户端执行该可枚举的任何进一步操作。这正是您所看到的行为的原因。

关于c# - 优化具有外键访问的 LINQ to SQL 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375998/

相关文章:

c# - SelectedItem.Text 是否在 if 语句中工作?

c# - 从 SQL Server Express 升级

sql - 如何使用 SQL DML 动态更改索引值

c# - 获取数组索引的优雅方式

c# - Linq 查询以选择最高记录

c# - 导入哪些目录以使用 Xml 和 Linq - C#

c# - 如何连接到 C# 中的本地套接字?

c# - 为什么 C# CreateObject 比 VB.NET 冗长得多?

c# - 将它们移动到另一个类后如何重命名属性或公共(public)字段?

sql - 如何创建每天显示月度值的 View