2013-01-16 57 views
1

我有一个类,如:获取计数使用LINQ和Entity Framework

public class Category 
{ 
    public int CategoryId { get; set; } 
    [Required] 
    public string Name { get; set; } 
    [NotMapped] 
    public int ProductCount { get; set; } 
    public virtual IEnumerable<Product> Products { get; set; } 
} 

我有一个目前看起来像这样的查询:

context.Categories.SortBy(sortByExpression).Skip(startRowIndex).Take(maximumRows) 

我需要包括我的类别网格中的ProductCount字段。是否可以扩展此LINQ查询以在不读取整个Product集合的情况下为我提供ProductCount属性?我可以在使用良好的旧SQL的子查询中做到这一点,但我很难用LINQ。

感谢

回答

0

这是大致你在找什么:

context.Categories.SortBy(sortByExpression).Skip(startRowIndex).Take(maximumRows) 
    .Select(c => new { c.CategoryId, c.Name, ProductCount = c.Products.Count() }); 

或有我误解你的问题?

更新代码

+0

'ProductCount'未映射(注意attribte),因此不能用于初始检索值。我假设这个属性是该查询的结果将被存储的地方。 –

+0

我明白了,那么问题是Count()的实现对于我猜测的产品的集合类型是什么。 'Select(c => new {c.CategoryId,c.Name,c.Products.Count()});'可能产生“合适的”SQL/Code /等。 –

+0

感谢您的建议。是的,ProductCount不存储在数据库中。我尝试了上面的代码,但我无法实现它的工作。正如所写,它返回一个匿名类型,它不会编译。如果我将它更改为'c => new Category',我会得到“实体或复杂类型'Category'不能在LINQ to Entities查询中构造。”我错过了什么吗? – John

0

你的问题并不清楚足够的,但如果我深知要在结果例如productCount新列和你的SQL查询做了它象下面这样:

SELECT c.*, , (SELECT COUNT(*) FROM Products p WHERE p.categoryId = c.id) AS productCount FROM 
Categories c 
WHERE <Conditions> 

现在,你希望能够做到这一点使用LINQ(如果您的问题真的这样),你可以如下做到这一点:

List<Category> categoryList = (from c in context.Categories let pCount = c.Products.Count() select 
new { categoryId = c.CategoryId, CategoryName = c.Name, productCount = pCount}) 
.OrderBy([sortByExpression]).Skip([startRowIndex]).Take([maximumRows]).ToList(); 

希望得到这个帮助。