我有以下数据库图表:
每个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();
答案 0 :(得分:2)
您的GetAllActiveProducts()
应该返回IQueryable<Product>
,而不是IEnumerable<Product>
。通过返回IEnumerable<Product>
,您可以有效地强制对该可枚举的任何进一步操作在客户端完成。这恰恰导致了你所看到的行为。