如何制作linq lambda表达式并动态设置要在表达式中使用的表?

时间:2019-06-06 01:36:54

标签: asp.net-mvc entity-framework linq lambda

我想使用于表达式的表动态设置

这是我的代码

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 lambda表达式中使用的表吗?

2 个答案:

答案 0 :(得分:2)

我的建议不是使用字符串来标识要使用的表,而是创建一个通用函数,其中表的类型是通用函数的参数。

假设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;
}

注意:Count中每个x的类型均为TableType,因此它是usertransaction

用法:使用建议的代码,在代码中的某处,您将调用以下函数:

string someIdFormat = ...
string autoId = AutoId(someIdFormat, "users");

使用我建议的功能,它将变为:

string autoId = AutoId<User>(someIdFormat);

您需要克服的问题之一是,您必须告诉AutoId函数userstransactions以及您要在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);

答案 1 :(得分:0)

该表是PayoutEntities的属性,因此您可以使用GetProperty()通过名称获取该属性。拥有该属性后,您应该可以在其中使用linq。