我的相应SQL查询是
sQuery = "Select * from Vehicle where " + variant + "='Y'";
如何在LINQ中编写相同的查询?
答案 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();
快乐编码。