динамически определять имя ключа, для которого необходимо определить значение - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть пара пар ключей-значений, что-то вроде этого

 List<Subscriptions> subs = new List<Subscriptions>();
subs.Add(new Subscriptions() { Id = 1, Name = "ABC" });
            subs.Add(new Subscriptions() { Id = 1, Name = "DEF" });

Я могу искать по одному ключу (ID или Имя), но я хочу, чтобы пользователь определил, какой ключ он хочет искать по ID или Имя

сейчас я использую этот подход для фильтрации списка на основе значения имени

 var filtered = subs.Where(sub => sub.Name.IndexOf(SearchString.Text,StringComparison.OrdinalIgnoreCase) >=0);

sub.Name определяется здесь статически, я хочу, чтобы пользователь выбирал то, что он хочет, чтобы его поиск был основан на

например, если у нас есть abc: Name , программа ищет abc в ключе имени и если у нас есть 1: Id , то она ищет 1 в идентификаторе. Это всего лишь пример, в реальном сценарии у меня может быть несколько полей в моем списке. Я надеюсь, что смогу прояснить это.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

Быстрый ответ:

string name = "";
int? id = null;

List<Subscriptions> subs = new List<Subscriptions>();

var query = subs.AsQueryable();
if (!string.IsNullOrEmpty(name))
    query = query.Where(p => p.Name == name);
if(id.HasValue)
    query = query.Where(p => p.id == id.Value);

var result = query.ToArray();

Подробный ответ: Вы можете прочитать о дереве выражений и IQueriable interface

По сути, вы можете избежать преобразования своего списка в IQueriable, если вы не используете что-то вроде Entity Frmework od OData. Но если вам нужно преобразовать выражение LINQ в нечто более сложное - вам следует использовать IQueriable или создать собственное дерево выражений.

0 голосов
/ 12 ноября 2018

Почему вы не применяете Where простым if else или switch

// keyword : abc:Name or  1:Id
var value = keyword.Split(':')[0];
var key = keyword.Split(':')[1];

if(key == "Name")
{
    var filterred = subs.Where(sub => sub.Name == value);
}
else if(key == "Id")
    var filterred = subs.Where(sub => sub.id == int.Parse(value));
}
...