Я хочу, чтобы запрос EF возвращал весь столбец, но я хочу выбрать этот столбец с переменной. Это можно сделать? I.E. используйте переменную вместо лямбда-выражения как такового:
FieldValues = db.PbiData
.Where(x => DatasetList.Contains(x.DatasetId))
.Select(FieldName)
.ToList()
Имя поля всегда будет соответствовать одному из имен столбцов таблицы 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);
};
}





да, вы можете использовать Expression
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();
Вы можете использовать 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();
@extensionhelp, когда вы говорите переменная. вы имеете в виду строковую переменную, у которой есть столбец? скажите columnName = "Department"? или ?
@extensionhelp, если это так, как описано в OP, проверьте обновленный ответ
Это не привело к ошибке, но когда я добавил ToList () в конец, она появилась. Есть идеи, почему?
Вы можете использовать .ToListAsync ().
Ошибка - исключение NullReferenceException на model.PbiData.Add(PbiFieldData); ... Я обновил полный код в OP.
Позвольте нам продолжить обсуждение в чате.
Вы можете написать собственный 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 первого набора данных.
Не думаю, что это то, что мне нужно. Как указано, имя столбца в списке выбора будет переменной, а не строкой.