计算相关实体而不加载它们,非通用方式

时间:2015-01-21 09:40:04

标签: c# linq entity-framework generics entity-framework-6

Here我学会了如何计算相关实体而不加载它们。问题是我在编译时没有实体类型。我的情况:

var postCount = context.Entry(someObject)   // someObject received from somewhere
                      .Collection(somePropertyString) 
                      .Query()              // and here I got a non-generic IQueryable
                      .Count();             // which has no Count method

如果我试图.Query().Cast<object>().Count()我在此行获得运行时异常:

  

发生System.NotSupportedException HResult = -2146233067
  消息=无法转换类型&#39; ...&#39;输入   &#39; System.Object的&#39 ;. LINQ to Entities仅支持转换EDM原语   或枚举类型。源=的EntityFramework

那么,如果我在编译时没有实体类型,如何计算相关实体而不加载它们?

2 个答案:

答案 0 :(得分:1)

使用反射是一种选择。这种扩展方法帮助了我:

public static int Count(this IQueryable q)
{
    return (int)q.Provider.Execute(
        Expression.Call(typeof(Queryable),
            "Count",
            new[] { q.ElementType },
            new[] { q.Expression }));
}

答案 1 :(得分:0)

你也可以写:

int count = context.Blogs.Single(blog=> blog.Id = yourCriteriaId).Posts.Count();

这也不会加载对象。

它会产生一些像这样的SQL语句(简化):

Select Count(*) from Post where Post.BlogID = 3