Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ中使用字符串作为字段名_C#_Linq_Linq To Sql_Linq To Objects - Fatal编程技术网

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

C# 在LINQ中使用字符串作为字段名,c#,linq,linq-to-sql,linq-to-objects,C#,Linq,Linq To Sql,Linq To Objects,查看下面的代码。我想用参数字段中收到的字段名替换用户名。此方法必须能够对多个字段进行搜索 谢谢, public void Searching(string field, string stringToSearch) { var res = from user in _dataContext.USERs where user.USERNAME.Contains(stringToSearch) select new {

查看下面的代码。我想用参数
字段
中收到的字段名替换
用户名
。此方法必须能够对多个字段进行搜索

谢谢,

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

}

你所尝试的是不可能的。但是,您可以使用来实现您想要的

您需要忘记匿名类型,也可以使用
元组
;但是:那么:

IQueryable<Foo> 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<Func<Foo, bool>>(
    Expression.Call(
        Expression.PropertyOrField(param, field),
        "Contains", null, Expression.Constant(stringToSearch)
    ), param);
var projection = Expression.Lambda<Func<Foo, Tuple<int, string>>>(
    Expression.Call(typeof(Tuple), "Create", new[] {typeof(int), typeof(string)},
        Expression.PropertyOrField(param, "Id"),
        Expression.PropertyOrField(param, field)), param);
Tuple<int,string>[] data = source.Where(predicate).Select(projection).ToArray();
IQueryable source=//您的源代码在这里
//内存中的虚拟示例:
//来源=新[]{
//新Foo{Id=1,Bar=“abc”},
//新Foo{Id=2,Bar=“def”}
//}.AsQueryable();
string field=“Bar”;
字符串stringToSearch=“d”;
var param=表达式参数(typeof(Foo),“x”);
var谓词=表达式.Lambda(
表情,打电话(
表达式.PropertyOrField(参数,字段),
“包含”,null,表达式.常量(stringToSearch)
),param);
var projection=Expression.Lambda(
Expression.Call(typeof(Tuple),“Create”,new[]{typeof(int),typeof(string)},
Expression.PropertyOrField(参数,“Id”),
表达式.PropertyOrField(param,field)),param);
Tuple[]data=source.Where(谓词).Select(投影).ToArray();

事实上,可以使用表达式API:

public void Searching(Expression<Func<User,string>> field, string stringToSearch)
{

   var call = Expression.Call(field.Body, typeof (string).GetMethod("Contains"), new[] {Expression.Constant(value)});
   Expression<Func<User, bool>> exp = Expression.Lambda<Func<User, bool>>(Expression.Equal(call, Expression.Constant(true)), field.Parameters);


    var res =  _dataContext.USERs.Where(exp).Select(u=>new { id= u.ID, Username = u.USERNAME});

}
公共无效搜索(表达式字段,字符串stringToSearch)
{
var call=Expression.call(field.Body,typeof(string).GetMethod(“Contains”),new[]{Expression.Constant(value)});
exp=Expression.Lambda(Expression.Equal(调用,Expression.Constant(true)),field.Parameters);
var res=_dataContext.USERs.Where(exp).Select(u=>new{id=u.id,Username=u.Username});
}

是LINQ到SQL还是LINQ到对象?如果我们去掉匿名类型(可能改用元组),这是可能的;事实上,如果动态LINQ库能够做到这一点,它一定是可能的;正在处理示例…@MarcGravel正在等待样本、其他样本不工作、编译错误和其他投影(
Select
)也需要自定义expression@MarcGravell:为什么?它是完全类型的所有方式!“我希望通过参数
字段
中接收的字段名remplace
用户名
”-因此
u.USERNAME
不存在;它将是
u.somethingeleshere
。不过,我确实喜欢您对基本体和参数使用传入表达式!哦,我没有领会到要求的那一部分:(@Kris-I:在
LambdaExpression
上应该有一个
Body
成员。该死,你比我快了一分钟……我没有时间测试我的。希望它仍然有效:)所以这是可能的,但这是查询不同列的好做法吗?我们不应该把他们分开吗,格雷威尔先生?我真的很佩服你的工作。@RoboLover你说的“划分它们”是什么意思?作为一个基本的“为我找到一些匹配项;我想要唯一的id和匹配的东西”,Lekris说
这种方法必须能够搜索多个字段。
如果我没有误解,他想发送一个参数,该参数将是查询中的列名。例如,用户名、手机、地址。我想问的是,这不应该用三个不同的查询来完成,而不是用这样的方法吗?如果我误解了,请原谅。@RoboLover:如果他想同时查询多个栏目,那么整个问题的措辞就错了。。。