LINQ for c#

时间:2016-12-30 05:37:51

标签: c# linq

我有多个车辆列的hava表 enter image description here

我的相应SQL查询是

sQuery = "Select * from Vehicle where " + variant + "='Y'";

如何在LINQ中编写相同的查询?

5 个答案:

答案 0 :(得分:2)

您可以使用System.Linq.Expression命名空间动态构建lambda表达式,并将其传递给Where方法。

例如:

public IQueryable<Vehicle> GetAccounts(string variant)
{
    // Build equivalent lambda to 'param => param.{variant} == "Y"'

    // This is lambda parameter
    var param = Expression.Parameter(typeof(Vehicle));

    // This is lambda body (comparison)
    var body = Expression.Equal(
        // Access property {variant} of param
        Expression.Property(param, typeof(Vehicle).GetProperty(variant)),
        // Constant value "Y"
        Expression.Constant("Y")
    );

    // Build lambda using param and body defined above
    var lambda = Expression.Lambda<Func<Vehicle, bool>>(body, param);

    // Use created lambda in query
    return VehicleDatatable.Where(lambda);
}

另一个想法是稍微转换查询。 您可以使用以下查询实现相同的工作:

sQuery = "Select * from Vehicle where (Tracks+Cars+Utility) LIKE '" + value + "'";

value为'Y__'或' Y '或'__Y',具体取决于您要查询的车型。它绝对不是最有效的,但转换为linq非常容易。

答案 1 :(得分:2)

构建您的查询:

var query = Vehiclelist;
if (column == "Trucks")
{
    query = query.Where(q => q.Trucks=="Y");
}
else if (column == "Cars")
{
    query = query.Where(q => q.Cars=="Y");
}
else if (column == "Utility")
{
    query = query.Where(q => q.Utility=="Y");
}

这种方法更易于维护,更易于测试。你有强类型表达式和透明过滤器。

答案 2 :(得分:0)

试试这个:

uniform

答案 3 :(得分:0)

使用lambda表达式:

VehicleDatatable.AsEnumerable().Where(q=>q.Trucks=="Y" || q.Cars=="Y" || q.Utility=="Y");

另一种方式

(from d in VehicleDatatable.AsEnumerable() where string.compare(d["Trucks"],"Y")==0 select d)

答案 4 :(得分:0)

这也可能是另一种方法:

PropertyInfo pi = typeof(Vehicles).GetProperty(vehVariant);
var services = context.Vehicles.ToList();

services = services.Where(item => pi.GetValue(item).ToString().Trim() == "Y").ToList();

快乐编码。