【发布时间】:2015-10-27 18:38:18
【问题描述】:
我有以下数据库图:
每个Product 使用LanguageKey 来确定其名称,每个LanguageKey 有多个LanguageValue 记录,其中包含每种语言的值。
现在在我的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();
【问题讨论】:
-
你是如何获取产品的?
-
@PraveenPaulose 对不起,我忘了。我添加了函数和调用。
标签: c# sql-server linq optimization