Lube
Lube

Reputation: 328

How to write more elegant mapping of these conditions?

I have 40 datasets, but when user click some of them I need to map their ID's to another dataset:

 public async Task<PagedResult<DataSetUpdateViewModel>> Handle(GetDataSetUpdateByDataSetIdQuery request, CancellationToken cancellationToken)
    { //this I need to refactor
     if(request.ID==29)
        {
            request.ID = 28;
            request.DeleteAble = true;
        }
      if(request.ID==30)
        { request.ID=31;
          request.DeleteAble = true;
        }
      if(request.ID==32)
        { request.ID=31;
          request.DeleteAble = true;
        }
      if(request.ID==33)
        { request.ID=31;
          request.DeleteAble = true;
        }
        //if request.ID is not 29,30,32 or 33, then it should be pass as it is
        var datasetUpdates = _context.DatasetUpdates
        .Where(c => request.ID > 0 && c.DatasetId == request.ID)
        .ProjectTo<DataSetUpdateViewModel>(_mapper.ConfigurationProvider,new { isDeleteAble = request.DeleteAble });
         

        PagedResult<DataSetUpdateViewModel> result = new PagedResult<DataSetUpdateViewModel>();
        result = await datasetUpdates.DynamicOrderBy("UpdateDate", "DESC")
                        .GetPagedAsync(request.PageNumber, request.PageSize, cancellationToken);
        return result;

    }

My GetDataSetUpdateByDataSetIdQuery looks like

    public int ID { get; set; }
    public int PageNumber { get; set; }
    public int PageSize { get; set; }
    public bool DeleteAble { get; set; }

I know I can assign Enums to these numbers, but it still does not solve a lot of if conditions

Upvotes: 0

Views: 68

Answers (3)

Enigmativity
Enigmativity

Reputation: 117124

It's maybe not as nice, but I like it:

public static class Ex
{
    public static Func<K, V> Map<K, V>(this IDictionary<K, V> source, Func<K, V> @default)
        => key => (key == null || !source.ContainsKey(key)) ? @default(key) : source[key];
}

Then you do:

var request = new Request() { ID = 29 };

var map = new Dictionary<int, (int, bool)>
{
    {29, (28, true)},
    {30, (31, true)},
    {32, (31, true)},
    {33, (31, true)}
}.Map(k => (k, false));

(request.ID, request.DeleteAble) = map(request.ID);

Upvotes: 0

jdweng
jdweng

Reputation: 34429

Use a Datatable for lookup :

            DataTable dt = new DataTable();
            dt.Columns.Add("old id", typeof(int));
            dt.Columns.Add("new id", typeof(int));
            dt.Columns.Add("deletable", typeof(Boolean));

            dt.Rows.Add(new object[] { 29, 28, true });
            dt.Rows.Add(new object[] { 30, 31, true });
            dt.Rows.Add(new object[] { 32, 31, true });
            dt.Rows.Add(new object[] { 33, 31, true });

            DataRow searchResults = dt.AsEnumerable().Where(x => x.Field<int>("old id") == 32).FirstOrDefault();

            int newId = searchResults.Field<int>("new id");

Upvotes: -1

Mathias R. Jessen
Mathias R. Jessen

Reputation: 174690

Use a simple Dictionary<int, int>:

internal static Dictionary<int, int> _queryMapping = new Dictionary<int, int>
{
    {29, 28},
    {30, 31},
    {32, 31},
    {33, 31}
}

// ...

public async Task<PagedResult<DataSetUpdateViewModel>> Handle(GetDataSetUpdateByDataSetIdQuery request, CancellationToken cancellationToken)
{
    if(_queryMapping.ContainsKey(request.ID)){
        request.ID = _queryMapping[request.ID];
        request.DeleteAble = true;
    }

    // ...
}

Upvotes: 3

Related Questions