Как создать лямбда-выражение linq и настроить таблицу для динамического использования в выражении? - PullRequest
0 голосов
/ 06 июня 2019

Я хотел, чтобы таблица, используемая для выражения, была установлена ​​динамически

Вот мой код

PayoutEntities payoutdb = new PayoutEntities();

 public String AutoID(String idFormat, String tablename)
 {
    string curdate = DateTime.Today.ToShortDateString().Replace("/", "");

    if (tablename == "users"){
       var count = payoutdb.users.Count(x => x.userid.Substring(0,10) == idFormat + curdate);
   }else if (tablename == "transactions"){
       var count = payoutdb.transactions.Count(x => x.transid.Substring(0,10) == idFormat + curdate);
   }
      count++;
      string ID = idFormat + curdate + count.ToString("0000");
      return ID;
}

В настоящее время у меня есть функция autoid для всех таблиц в моей базе данных, поэтому сейчас я думаю о способе сделать более короткий код, а не помещать мой код в оператор if. Есть ли способ динамически задавать таблицу, используемую в лямбда-выражении linq?

Ответы [ 2 ]

2 голосов
/ 06 июня 2019

Мой совет - не использовать строку для идентификации используемой таблицы, а создавать обобщенную функцию, в которой тип таблицы является параметром обобщенной функции.

Предполагается, что 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);
0 голосов
/ 06 июня 2019

Таблица является свойством PayoutEntities, поэтому вы можете получить это свойство по имени, используя GetProperty ().Если у вас есть свойство, вы сможете использовать с ним linq.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...