简体   繁体   English

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

[英]How to write Dynamic LINQ queries using DBContext in C#

I am modifying my project to use DBContext instead of ObjectContext. 我正在修改项目以使用DBContext而不是ObjectContext。 My existing code 我现有的代码

var query = context.Vehicles.OrderBy("it.VehicleType.VehicleTypeID").
            GroupBy("it.VehicleType.VehicleTypeID", "Min(it.ODO_Reading) AS MinRunVehicle, it.VehicleType.VehicleTypeID");

The above code is written using ObjectContext. 上面的代码是使用ObjectContext编写的。 After changing my project to inherit from DBContext I am getting the below error 将项目更改为从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.

I want to know how to specify dynamic Linq query in DBContext. 我想知道如何在DBContext中指定动态Linq查询。 Can somebody help. 有人可以帮忙吗?

您可以使用

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

Here's how to convert it all including OrderBy and GroupBy 这是转换包括OrderByGroupBy在内的所有内容的方法

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();

在此处输入图片说明

The first example uses eSQL, not some type of dynamic LINQ. 第一个示例使用eSQL,而不是某种类型的动态LINQ。

DbContext doesn't allow you to perform eSQL queries directly, but you can get access to the underlying ObjectContext and use it as before: DbContext不允许您直接执行eSQL查询,但是您可以访问底层的ObjectContext并像以前一样使用它:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM