在linq中如何动态传递表名和列名

时间:2010-07-11 06:21:11

标签: .net linq linq-to-sql linq-to-objects

我想编写一个动态linq,我发送表和列名称,此查询返回表格的最大行号。

SELECT ISNULL(MAX(intProductCode) + 1, 1) AS intProductCode FROM tblProductInfo

上面是我的T-SQL语法。我想从linq获得相同的输出如何

如果我写这个波纹管语法得到相同的输出,但在这里我不能设置表和列名称

this.Context.tblProductInfos.Max(p=>p.intProductCode)

如何在linq上设置表名和列名,返回该表的最大行号。

3 个答案:

答案 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();

也;如果intProductCodeIDENTITY,您可能需要查看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)
  1. tblProductInfos实际上是一个强类型的'表名'
  2. p=>p.intProductCode是获取“列名称”
  3. 的表达式

    一切都很好而且清晰。不需要神奇的字符串。这就是ORM for。