C# 如何在C中使用DBContext编写动态LINQ查询#

C# 如何在C中使用DBContext编写动态LINQ查询#,c#,entity-framework,linq,dbcontext,entity-sql,C#,Entity Framework,Linq,Dbcontext,Entity Sql,我正在修改我的项目以使用DBContext而不是ObjectContext。 我现有的代码 var query = context.Vehicles.OrderBy("it.VehicleType.VehicleTypeID"). GroupBy("it.VehicleType.VehicleTypeID", "Min(it.ODO_Reading) AS MinRunVehicle, it.VehicleType.VehicleTypeID"); 上面的代码是使用Ob

我正在修改我的项目以使用DBContext而不是ObjectContext。 我现有的代码

var query = context.Vehicles.OrderBy("it.VehicleType.VehicleTypeID").
            GroupBy("it.VehicleType.VehicleTypeID", "Min(it.ODO_Reading) AS MinRunVehicle, it.VehicleType.VehicleTypeID");
上面的代码是使用ObjectContext编写的。 将我的项目更改为从DBContext继承后,出现以下错误

    Error   89  The type arguments for method 'System.Linq.Queryable.OrderBy<TSource,TKey>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,TKey>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
Error 89无法从用法推断方法“System.Linq.Queryable.OrderBy(System.Linq.IQueryable,System.Linq.Expressions.Expression)”的类型参数。尝试显式指定类型参数。
我想知道如何在DBContext中指定动态Linq查询。有人能帮忙吗。

你可以用

var query = context.Vehicles.OrderBy(m=>m.it.VehicleType.VehicleTypeID)

下面介绍如何转换所有内容,包括
OrderBy
GroupBy

void Main()
{

    var vehicles = new List<Vehicle>();

    for (int i = 0; i < 10; i++)
    {
        vehicles.Add(new Vehicle());
    }

    vehicles.OrderBy(vehicle     => vehicle.VehicleType.VehicleTypeID)
            .GroupBy(vehicleType => vehicleType.VehicleType.VehicleTypeID, 
                     vehicle     => vehicle.ODO_Reading, 
                                    (vehicleTypeID, minRunVehicle) => new 
                                    {
                                        VehicleTypeId = vehicleTypeID, 
                                        minRunVehicle = minRunVehicle
                                    })
            .ToList()
            .ForEach(vehicle => 
                     {
                         Console.WriteLine(vehicle.VehicleTypeId);
                         vehicle.minRunVehicle.ToList()
                                              .ForEach(minRun =>
                                              {
                                                  Console.WriteLine ("\t > :" + minRun);
                                              });
                         Console.WriteLine ("\n");
                     });
}

public class Vehicle
{
    public Vehicle()
    {
        this.VehicleType = new VehicleType();
        this.ODO_Reading = random.Next(100, 100000);
    }

    public VehicleType VehicleType { get; set;  }
    public int ODO_Reading { get; set; }
}

public class VehicleType
{
    public VehicleType()
    {
        VehicleTypeID = random.Next(1, 10);
    }

    public int VehicleTypeID { get; set; }
} 

public static Random random = new Random();
void Main()
{
var车辆=新列表();
对于(int i=0;i<10;i++)
{
车辆。添加(新车());
}
车辆.订购人(车辆=>车辆.车辆类型.车辆类型ID)
.GroupBy(vehicleType=>vehicleType.vehicleType.VehicleTypeID,
vehicle=>vehicle.ODO_读数,
(vehicleTypeID,minRunVehicle)=>新建
{
VehicleTypeId=VehicleTypeId,
minRunVehicle=minRunVehicle
})
托利斯先生()
.ForEach(车辆=>
{
控制台写入线(vehicle.VehicleTypeId);
vehicle.minRunVehicle.ToList()
.ForEach(minRun=>
{
Console.WriteLine(“\t>:”+minRun);
});
Console.WriteLine(“\n”);
});
}
公车
{
公共车辆()
{
this.VehicleType=新VehicleType();
this.ODO_Reading=random.Next(100100000);
}
公共车辆类型车辆类型{get;set;}
公共int ODO_读取{get;set;}
}
公营车辆类型
{
公共车辆类型()
{
VehicleTypeID=随机。下一步(1,10);
}
公共int VehicleTypeID{get;set;}
} 
公共静态随机=新随机();

第一个示例使用eSQL,而不是某种类型的动态LINQ

DbContext不允许您直接执行eSQL查询,但您可以访问底层ObjectContext并像以前一样使用它:

var query = ((IObjectContextAdapter)context).ObjectContext
                                            .CreateQuery<Vehicle>("<ESQL Query>")
var query=((IObjectContextAdapter)context).ObjectContext
.CreateQuery(“”)

您不需要动态查询,您可以通过连续应用LINQ函数,使用流畅的样式创建查询,例如
q=q.Where(…);如果(x){q=q.GroupBy(…).OrderBy(…);}
是的,我可以使用LINQ方法编写查询,但我不应该使用LINQ方法,因为我的项目坚持使用动态查询。没有动态LINQ查询。你把林克和我搞混了吗?您的第一个示例不是LINQ,而是eSQLI,我希望使用[DBContext]编写上述ESQL。以前我的类继承自ObjectContext。ObjectContext中支持ESQL,但我无法使用DBContext编写ESQL。DBContext包含ObjectContext。您可以使用
((IObjectContextAdapter)context)来访问它。ObjectContext
…您在哪里找到ODO_Reading的最小值?但是如果您看到我的查询,它在GroupBy和OrderBy中包含ESQL。是否可以在ESQL中编写这些内容?我知道了。我可以给出如下
var query1=context.objectContext.CreateQuery(“TIME'23:59:59')).OrderBy(x=>x.EmployeeName)