【问题标题】:Lambda Select Columns Without an ExpressionLambda 选择没有表达式的列
【发布时间】:2019-01-12 01:32:14
【问题描述】:

我希望 EF 查询返回一整列,但我想选择带有变量的列。可以这样做吗? IE。像这样使用变量而不是 lambda 表达式:

FieldValues = db.PbiData
  .Where(x => DatasetList.Contains(x.DatasetId))
  .Select(FieldName)
  .ToList()

FieldName 将始终匹配 PbiData 表的列名之一。例如,第一个 FieldName 值为“Department”,下面的查询就可以正常工作:

FieldValues = db.PbiData
  .Where(x => DatasetList.Contains(x.DatasetId))
  .Select(x=>x.Department)
  .ToList()

每个查询中的 where 子句只是将返回的数据限制为与当前用户相关的数据。

我的尝试,根据下面的评论:

    foreach(var F in model.FieldMetaData)
    {

        if (F.FieldType == "String")
        {
            PbiFieldData PbiFieldData = new PbiFieldData()
            {
                FieldName = F.FieldName,
                FieldValues = await db.PbiData.Where(x => DatasetList.Contains(x.DatasetId)).Select(F.FieldName).ToListAsync()
        };

            model.PbiData.Add(PbiFieldData);
        };
    }

【问题讨论】:

    标签: c# linq lambda


    【解决方案1】:

    是的,你可以使用表达式

    ParameterExpression param = Expression.Parameter(typeof(Table), yourVariable);
    MemberExpression propExpression = Expression.PropertyOrField(param, yourVariable);
    Expression<Func<Table, string>> selector = Expression.Lambda<Func<Table, string>>(propExpression, param);
    var result = db.Table.Select(selector).First();
    

    【讨论】:

      【解决方案2】:

      您可以使用System.Linq.Dynamic Nuget 来达到目的

      var fieldName = "Department";
      var results = context.PbiData
                           .Where(x=> DatasetList.Contains(x.DatasetId))
                           .Select(fieldName);
      

      根据注释,转成List,可以使用

      var results = await context.PbiData
                           .Where(x=> DatasetList.Contains(x.DatasetId))
                           .Select(fieldName).ToListAsync();
      

      【讨论】:

      • 我认为这不是我所需要的。如前所述,选择列表中的列名将是一个变量,而不是一个字符串。
      • @extensionhelp 当你说 variable 时。你的意思是,一个具有列名的字符串变量?说 columnName = "部门" ?还是?
      • @extensionhelp 如果是这种情况,如 OP 中所述,请检查更新的答案
      • 这并没有产生错误,但是当我将 ToList() 添加到末尾时,它确实产生了。知道为什么吗?
      • 你可以使用 .ToListAsync()。
      【解决方案3】:

      您可以编写原生 sql 查询:

      var FieldValues = ctx.Database.SqlQuery<string>
      (
      $@"select {fieldName} from PbiData 
      where DatasetId in ({string.Join(", ", DatasetList.Select(x => $"'{x}'"))})"
      ).ToList();
      

      【讨论】:

      • 不走运。这会立即在第一个 @ 符号“逐字说明符 @ 之后预期的关键字、标识符或字符串”上产生错误
      • 我收到了错误Invalid pseudocolumn "$abffc3b5". ...我应该提到,DatasetList 和 DatasetIds 是 GUID,所以可能需要区别对待。
      • 澄清一下,字符串“abffc3b5”是第一个数据集的 GUID 的一部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多