没有表达式的Lambda选择列

时间:2019-01-09 23:09:50

标签: c# linq lambda

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

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

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

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

3 个答案:

答案 0 :(得分:0)

是的,您可以使用表达式

"SetTable" ->> ["Set", "Table"]
"GetForeignKey" ->> ["Get", "ForeignKey"]  //No split on Key!

答案 1 :(得分:0)

您可以为此目的使用System.Linq.Dynamic Nuget

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

基于评论,可以转换为列表,

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

答案 2 :(得分:0)

您可以编写本机sql查询:

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