2016-12-30 4 views
1

IのHAVAテーブルenter image description hereLINQ複数の車両の列 と

マイ対応するSQLクエリ私はLINQで同じクエリを書くことができますどのように

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

がありますか?

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

あなたはSystem.Linq.Expression名前空間を使用してラムダ式を動的に構築することができます

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

[ダイナミックLINQの条件]の可能な複写(http://stackoverflow.com/questions/5674639/dynamic-where-condition-in-linq) –

答えて

0

これを試してみてください。例えば

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

もう一つのアイデアは、クエリを少し変換することです。 次のクエリを使用して同じ作業を実現することができます

valueを照会したい車両タイプに応じて「Y__」または「 Y」または「__Y」です
sQuery = "Select * from Vehicle where (Tracks+Cars+Utility) LIKE '" + value + "'"; 

。それは間違いなく最も効果的ですが、それはlinqに変換するのはかなり簡単です。

+0

これは私の問題を解決しません。私は変数として列名を取得します。そして、私はその列だけを照会する必要があります。 –

2

別の方法をしてWhereメソッドに渡し:ラムダ式を使用して

Vehiclelist.Where(q => q.Trucks=="Y" || q.Cars=="Y" || q.Utility=="Y"); 
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"); 
} 

このアプローチは、より多くのテスト可能な、より保守です。強い型の式と透明なフィルタがあります。

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

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

ハッピーコーディング:

+0

私はこれが文字通りOPの要件に適合していなくてもこれを好きです。 –

0

これはまた別のアプローチかもしれません。

関連する問題