简体   繁体   中英

Is there a better way to generalize dbSet with the same attribute - Entity Framework

I have a common pattern

bool doesLinkExist = await [DBSet]
.AnyAsync(model => model.PartId == parameters.PartId).ConfigureAwait(false);

if(doesLinkExist)
   throw exception (which has different messages)

[DBSet]=>Table in the database.

If I create a method it is really easy to pass the exception message but the DB set seems to be the problem as the code doesn't know that there are PartId columns in different [DBset]s/tables

What could be a way to bypass this problem and to create a common method?

Edit: In 2 words, I want to pass the [DBSet] as a parameter

This is the way that I would like this method to look like

private Task CheckLinkExistAsync(int idForLookUp, string errorMsg, DBSet table, CancellationToken cancellationToken)
{
  bool LinkExist = await table.AnyAsync(model => model.Id == idForLookUp, cancellationToken).ConfigureAwait(false);

  if(LinkExist)
     throw exception (which has different messages)
}

Creating a method that accepts a Func as a parameter is probably what you're looking for.


        private async Task<IActionResult> CheckLinkExistsAsync(int id, string errorMessage, Func<Task<T>> func)
        {
            bool exists = await _modelRepository.Any(x => x.Id == id);

            if (exists)
            {
                return await func();
            }
            throw new Exception(errorMessage);
        }

Afterwards, you can consume it like this

await CheckLinkExistsAsync(1, "Custom Error Message", async () => {
  // DO STUFF AND RETURN
  var t = new T();
  return t;
});

I tried many different ways(with dynamic or DbSet< T>) but didn't think that I am filtering only on the ID so that's why I can just pass a List<int> and filter on it

private void CheckLinkExistsAsync(int partId, string errorMessage, List<int> idsToLookup)
    {
        bool exists = idsToLookup.Any(id => id == partId);
        if(exists)
            throw new Exception(errorMessage);
    }

And I call it like this

CheckLinkExistsAsync(parameters.PartId, "ExceptionMessage",
                await Db.Table.Select(model => model.PartId).ToListAsync(cancellationToken).ConfigureAwait(false));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM