Мой совет - не использовать строку для идентификации используемой таблицы, а создавать обобщенную функцию, в которой тип таблицы является параметром обобщенной функции.
Предполагается, что payoutDb - это ваш DbContext, вы можете использовать DbContext.Set для доступа к соответствующей таблице:
public string AutoId<TableType>(string idFormat)
{
string curdate = DateTime.Today.ToShortDateString().Replace("/", "");
var count = payoutdb.Set<TableType>()
.Count(x => x.userid.Substring(0,10) == idFormat + curdate);
count++;
string ID = idFormat + curdate + count.ToString("0000");
return ID;
}
примечание: каждый x
в Count имеет тип TableType
, поэтому это user
или transaction
.
Использование: Используя предложенный код, где-то в вашем коде, вы бы вызвали функцию следующим образом:
string someIdFormat = ...
string autoId = AutoId(someIdFormat, "users");
Используя мою предложенную функцию, это станет:
string autoId = AutoId<User>(someIdFormat);
Одна из проблем, которую вам придется преодолеть, заключается в том, что вы должны сообщить своей функции AutoId, что users
и transactions
и все другие таблицы, которые вы хотели использовать в AutoId
иметь свойство AutoId
.
Метод, который вы можете использовать, будет определять интерфейс:
interface IAutoId
{
string AutoId {get;}
}
class User : IAutoId
{
public string AutoId {set; set;}
...
}
class Transation: IAutoId
{
public string AutoId {set; set;}
...
}
public string AutoId<TableType>(string idFormat) where TableType: IAutoId
{
...
Если вы не хотите делать это для таблиц, которые вы хотитечтобы использовать, рассмотрите возможность сообщить функции AutoId, какое свойство она должна использовать:
public string AutoId<TableType>(string idFormat, Func<TableType, string> propertySelector)
{
...
var count = payoutdb.Set<TableType>()
.Count(x => propertySelector(x).Substring(0,10) == idFormat + curdate);
...
}
Вы хотите, чтобы деталь propertySelector(x)
вызывала x.UserId
, поэтому вы бы вызывали функцию следующим образом:
string autoId = AutoId<User>(someIdFormat, user => user.UserId);
Приятной особенностью этого метода является то, что вы также можете использовать свою функциюдля других свойств:
string autoId = AutoId<User>(someIdFormat, user => user.UserName);