如何重用 LINQ 子查询

本文关键字:查询 LINQ 何重用 | 更新日期: 2023-09-27 18:31:25

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

如何重用 LINQ 子查询

如果此示例代码真正代表您的实际代码,那么问题是您返回的是IQueryable,而不是IQueryable<T>。这样做的原因是,由于getMySubQuery,您尝试使用匿名类型,但无法跨方法边界共享匿名类型。如果确实要执行此操作,则需要创建一个类型,该类型表示当前作为匿名类型返回的数据,然后确保更改getMySubQuery以返回该类型的IQueryable<T>

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