我想使用于表达式的表动态设置
这是我的代码
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表达式中使用的表吗?
答案 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
,因此它是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);
答案 1 :(得分:0)
该表是PayoutEntities的属性,因此您可以使用GetProperty()通过名称获取该属性。拥有该属性后,您应该可以在其中使用linq。