简体   繁体   English

LINQ用于C#中表中的动态列

[英]LINQ for dynamic columns in a table in c#

I hava table with multiple vehicle columns 我有多辆车列的桌子 在此处输入图片说明

My corresponding SQL Query is 我对应的SQL查询是

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

How can I write the same query in LINQ? 如何在LINQ中编写相同的查询?

You can build lambda expression dynamically by using System.Linq.Expression namespace and pass it to Where method. 您可以使用System.Linq.Expression命名空间动态构建lambda表达式,并将其传递给Where方法。

For example: 例如:

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

Another idea is to convert query a bit. 另一个想法是将查询转换一下。 You can realize same work using following query: 您可以使用以下查询来实现相同的工作:

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

Where value is 'Y__' or ' Y ' or '__Y' depending on which vehicle type you want to query. 根据要查询的车辆类型, value是“ Y__”或“ Y ”或“ __Y”。 It's definitely not most effective, but that is pretty easy to convert to linq. 绝对不是最有效,但这很容易转换为linq。

Build your query: 建立您的查询:

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");
}

This approach is more maintainable, more testable. 这种方法更可维护,更可测试。 You have strong-typed expressions and transparent filters. 您具有强类型表达式和透明过滤器。

尝试这个:

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

using lambda expression : 使用lambda表达式:

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

Another way 其他方式

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

This may also be another approach: 这也可能是另一种方法:

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

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

Happy Coding. 编码愉快。

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

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