在LINQ中使用字符串作为字段名称

看下面的代码。 我想用参数field收到的字段名替换USERNAME 。 此方法必须能够在多个字段上进行一些搜索。

谢谢,

 public void Searching(string field, string stringToSearch) { var res = from user in _dataContext.USERs where user.USERNAME.Contains(stringToSearch) select new { Id = user.ID, Username = user.USERNAME }; } 

你需要忘记匿名类型,也许使用Tuple ; 但是:怎么样:

 IQueryable source = // YOUR SOURCE HERE // in-memory dummy example: // source = new[] { // new Foo {Id = 1, Bar = "abc"}, // new Foo {Id = 2, Bar = "def"} // }.AsQueryable(); string field = "Bar"; string stringToSearch = "d"; var param = Expression.Parameter(typeof (Foo), "x"); var predicate = Expression.Lambda>( Expression.Call( Expression.PropertyOrField(param, field), "Contains", null, Expression.Constant(stringToSearch) ), param); var projection = Expression.Lambda>>( Expression.Call(typeof(Tuple), "Create", new[] {typeof(int), typeof(string)}, Expression.PropertyOrField(param, "Id"), Expression.PropertyOrField(param, field)), param); Tuple[] data = source.Where(predicate).Select(projection).ToArray(); 

事实上,可以使用Expression API:

 public void Searching(Expression> field, string stringToSearch) { var call = Expression.Call(field.Body, typeof (string).GetMethod("Contains"), new[] {Expression.Constant(value)}); Expression> exp = Expression.Lambda>(Expression.Equal(call, Expression.Constant(true)), field.Parameters); var res = _dataContext.USERs.Where(exp).Select(u=>new { id= u.ID, Username = u.USERNAME}); } 

你正在尝试的是不可能的。 但是,您可以使用动态linq库来实现您想要的效果