【问题标题】:How to make a linq lambda expression and set the table to be used in the expression dynamically?如何制作 linq lambda 表达式并动态设置要在表达式中使用的表?
【发布时间】:2019-06-06 01:36:54
【问题描述】:

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

这是我的代码

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

【问题讨论】:

  • 动态部分不仅仅是表格,还有PK属性。调用此方法时,您从哪里得到tablename?能介绍一下这个方法的用法(调用代码)吗?

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


【解决方案1】:

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

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

【讨论】:

  • 感谢@Harald Coppoolse :)
【解决方案2】:

该表是 PayoutEntities 的一个属性,因此您可以使用 GetProperty() 按名称获取该属性。拥有该属性后,您应该可以使用 linq。

【讨论】:

  • 你能举个例子告诉我应该怎么做吗?
  • 很抱歉再次问我,我只是 linq 的初学者,但你能向我演示一下如何将它应用到我的场景中吗?
猜你喜欢
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多