簡體   English   中英

LINQ用於C#中表中的動態列

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

我有多輛車列的桌子 在此處輸入圖片說明

我對應的SQL查詢是

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

如何在LINQ中編寫相同的查詢?

您可以使用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。

建立您的查詢:

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

這種方法更可維護,更可測試。 您具有強類型表達式和透明過濾器。

嘗試這個:

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

使用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)

這也可能是另一種方法:

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

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

編碼愉快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM