优化具有外键访问权限的LINQ to SQL语句

时间:2015-10-27 18:38:19

标签: 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的诊断工具时,执行查询树时(当我在视图中调用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的方式(上下文是我的DbContext,函数在ProductService类中,productService是它的实例):

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

    var products = productService.GetAllActiveProducts();

1 个答案:

答案 0 :(得分:2)

您的GetAllActiveProducts()应该返回IQueryable<Product>,而不是IEnumerable<Product>。通过返回IEnumerable<Product>,您可以有效地强制对该可枚举的任何进一步操作在客户端完成。这恰恰导致了你所看到的行为。