как создать несколько операторов лямбда-выражения из строки - PullRequest
0 голосов
/ 07 октября 2018

у нас есть некоторые пользовательские данные. В какой-то момент мы хотим изменить значения пользовательских данных для пользователей, которые удовлетворяют некоторым критериям.Например: когда пользователь в режиме онлайн> 100 часов, мы можем добавить бонус он 10 золотых монет.

Теперь я использую следующий код для корректировки данных

<!-- language: c# -->
public void UserBounds(List<userdata> DataList)
{

    DataList.Where(p => p.Onlinetime > 100).Select(x =>
            {
                x.Bound = x.Bound + 10;
                return x;
            }).ToList();

    DataList.Where(p => p.isFirstLogin).Select(x =>
            {
                x.Bound = x.Bound + 1;
                return x;
            }).ToList();
}

Затемкритерии теперь намного выше, я хочу использовать строковое выражение для выполнения этих действий, я поместил фильтры и вознаграждения в List.like sql where и обновил синтаксис.например
| --------------------- | ------------------ ||Фильтр |Границы || --------------------- | ------------------ ||Онлайн> 100 |Связанный = Связанный + 10 || ----------------------- | -------------------- ||isFirstLogin |Связанный = Связанный + 5 || ----------------------- | -------------------- |

Теперь я использую system.linq.dynamic, он может использовать строку фильтра как выражение, но как я могу сгенерировать операторы Expression из строки bounds.лайк "Связан = Связан + 10" , Выражение

    x =>{
          x.Bound = x.Bound + 10;
          return x;
        };

спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 07 октября 2018

спасибо Хан.1.Linq может обновить значение элемента списка, как это

var datas = data.ToList();

datas.Select(p => {
    p.Bound=p.Bound+100;
    return p;
}).ToList();

datas.Dump();

тест LinqPad

2. ключ не обновить данные списка, в моих данныхМне нужно изменить результаты данных в соответствии со многими условиями, поэтому определенные в коде условия не применимы, только соответствующие выражения могут быть сгенерированы динамически, а затем использовать это выражение для обновления данных, ключ преобразования строкив лямбда-выражение.например, конвертировать "Bound = Bound + 10" в выражение

x=>{x.Bound = x.Bound + 10;
return x;}

3. Я думаю, что, возможно, используйте Expression<Action<data>> or Expression<Action<data,data>>, но я не нашел способа проверить это.

0 голосов
/ 07 октября 2018

Напоминаем, что Linq используется для запроса данных, а не для обновления данных.Запрос может преобразовать данные в другую форму.

void Main()
{
    var data = new []
    {
        new Data { IsFirstLogin = true , OnlineTime =   0, Bound = 0  }, // bound + 5
        new Data { IsFirstLogin = true , OnlineTime = 101, Bound = 0  }, // bound + 15
        new Data { IsFirstLogin = false, OnlineTime =  50, Bound = 10 }, // bound + 0
        new Data { IsFirstLogin = false, OnlineTime = 200, Bound = 25 }, // bound + 10
    };

    var query = data
        .Select(x =>
            {
                x.Bound += 
                    x.IsFirstLogin && x.OnlineTime > 100 ? 15 :
                    x.IsFirstLogin ? 5 :
                    x.OnlineTime > 100 ? 10 : 0;
                return x;
            }
        )
        .Dump() // remove this line if not in LinqPad
    ;
}

public class Data
{
    public bool IsFirstLogin { get; set; }
    public int OnlineTime { get; set; }
    public int Bound { get; set; }
}

Результат в LinqPad: enter image description here

Альтернативное решение, добавить 2 несопоставленных свойства к классу.

void Main()
{
    var data = new []
    {
        new Data { IsFirstLogin = true , OnlineTime =   0, Bound = 0  }, // bound + 5
        new Data { IsFirstLogin = true , OnlineTime = 101, Bound = 0  }, // bound + 15
        new Data { IsFirstLogin = false, OnlineTime =  50, Bound = 10 }, // bound + 0
        new Data { IsFirstLogin = false, OnlineTime = 200, Bound = 25 }, // bound + 10
    };

    var query = data
        .Select(x =>
            {
                x.Bound += x.GetBoundIsFirstLogin + x.GetBoundOnlineTime;
                return x;
            }
        )
        .Dump() // remove this line if not in LinqPad
    ;
}

public class Data
{
    public bool IsFirstLogin { get; set; }
    public int OnlineTime { get; set; }
    public int Bound { get; set; }

    [NotMapped]
    public int GetBoundIsFirstLogin => IsFirstLogin ? 5 : 0;
    [NotMapped]
    public int GetBoundOnlineTime => OnlineTime > 100 ? 10 : 0;
}
...