Linq to Entities查询的结果的基础类型是什么?

时间:2011-01-20 00:49:05

标签: asp.net linq

例如,

var result = from category in myEntities.Categories
                     where category.UserId == userId
                     orderby category.CategoryName
                     select category;

“结果”的类型是什么?我将它转换为IQueryable变量并且它工作,除了它没有一些通常可用的方法,例如计数()。在我的程序中,我必须将它转换为一些显式类型,然后使用Count()方法。我该怎么办?

3 个答案:

答案 0 :(得分:4)

您应该将它用作IQueryable<Category>,这是它的编译时类型。

在运行时,它将是ObjectQuery<Category>。但是,你不应该使用它。

答案 1 :(得分:1)

使用此:

IQueryable<Category> categories = from x category in myEntities.Categories
                                  where category.UserId == userId
                                  orderby category.CategoryName
                                  select category;

我不明白为什么在这种情况下计数不可用。也许如果你要投射到IQueryable而不是IQueryable<Category>

编辑:刚试过它。这肯定是因为你使用了没有类型的通用IQueryable。使用它时,.Count()不可用。您必须包含类型。

EDIT2:如果要创建匿名类型,则必须使用var关键字。您需要创建一个类型才能进行投射。

创建一个这样的自定义类型:

public class MyCustomType
{
     public string CategoryName { get; set; }
     public int UserId { get; set;}
}

然后实例化您的可枚举自定义类型,如下所示:

IEnumerable<MyCustomType> myCustomTypes = from x category in myEntities.Categories
                                          where category.UserId == userId
                                          orderby category.CategoryName
                                          select new MyCustomType { CategoryName = category.CategoryName, UserId = category.UserId };

执行此操作时,您无法使用IQueryable,因为IQueryable允许您将表达式树发送到数据源。 myEntities.Categories实现了IQueryable,因此我们刚刚列出的查询在源头执行,但IEnumerable<MyCustomType>上的进一步查询将在内存中的对象上执行。

答案 2 :(得分:0)

作为对其他答案的补充,您还可以使用AsQueryable()方法获取一个IQueryable对象,该对象将包含所有常用的Linq查询方法。