如何重用LINQ子查询

时间:2013-09-13 22:10:56

标签: c# linq entity-framework

我正在编写一个包含多个连接操作的查询。我想在函数中编写此查询,以便每次需要此查询时都可以调用此函数。我的功能和查询如下。由于我有几个连接操作,并且我不想定义复杂的返回类型,因此我只保留返回类型IQueryable

 private IQueryable getMySubQuery(MyContext db)
 {
       var query = db.Orders
                         .Join( ... )
                         .Join( ... )
                         .Join( ... );
       return query;
 }

public IQueryable <MyType> getData()
{
     var db = ... 
     ... 
     ...
     var query = getMySubQuery(db)
                     .Select(  /// ERROR ???

    return query;
}

我收到错误:System.Linq.IQueryable不包含Select的定义。

我理解如果我将getMySubQuery()方法的返回类型定义为IQueryable <SomeType>,它将解决问题。但问题是我必须定义一个包含50个字段的非常复杂的类型。我不想在getMySubQuery()函数中进行投影。有没有办法在不创建复杂类型的情况下解决它?我想使用IQueryable而不是IEnumerable

2 个答案:

答案 0 :(得分:4)

如果此示例代码真实代表您的实际代码,则问题是您返回的是IQueryable,而不是IQueryable<T>。你之所以这样做是因为你试图使用匿名类型作为getMySubQuery的结果,但是不可能跨方法边界共享匿名类型。如果您真的想要这样做,则需要创建一个表示当前作为匿名类型返回的数据的类型,然后确保将getMySubQuery更改为返回该类型的IQueryable<T>。< / p>

答案 1 :(得分:0)

试试这个:var query = getMySubQuery(db).Tolis() .Select( /// No ERROR!