我想编写一个动态linq,我发送表和列名称,此查询返回表格的最大行号。
SELECT ISNULL(MAX(intProductCode) + 1, 1) AS intProductCode FROM tblProductInfo
上面是我的T-SQL语法。我想从linq获得相同的输出如何
如果我写这个波纹管语法得到相同的输出,但在这里我不能设置表和列名称
this.Context.tblProductInfos.Max(p=>p.intProductCode)
如何在linq上设置表名和列名,返回该表的最大行号。
答案 0 :(得分:1)
LINQ不是一切的答案。当然,你可以查询数据上下文以获取所有这些信息,但是你将要做一个很多的工作(反射或映射,再加上构建一个Expression
),只是让sql生成器反转所有以获取TSQL。只需构建TSQL(确保将表/列名称列入白名单以防止注入)并使用ExecuteQuery
, lot 就更简单了。
例如:
string tsql = string.Format(
"SELECT ISNULL(MAX([{0}]) + 1, 1) AS [{0}] FROM [{1}]",
colName, tableName);
int max = dataContext.ExecuteQuery<int>(tsql).First();
也;如果intProductCode
是IDENTITY
,您可能需要查看IDENT_CURRENT(tableName)
, 比MAX
更高效。
答案 1 :(得分:1)
你走了:
int GetMax<T>(DataContext dc, Expression<Func<T, int>> selector)
{
int result = dc.GetTable<T>().Max(selector);
return result;
}
这样称呼:
int maxId = GetMax<Customer>(myDC, c => c.CustomerId);
另一方面,您可以在数据库中使用IDENTITY列。然后你不必+1,而且你不必处理来自多个连接的冲突。
答案 2 :(得分:0)
据我所知,你并不需要任何动态的linq。
你应该停止思考SQL魔术字符串,如表名和列名。 L2S允许您以强类型方式编写查询。检查您已编写的代码。
this.Context.tblProductInfos.Max(p=>p.intProductCode)
tblProductInfos
实际上是一个强类型的'表名'p=>p.intProductCode
是获取“列名称”一切都很好而且清晰。不需要神奇的字符串。这就是ORM for。