如何使用动态linq将两列转换为单个字符串列?

时间:2014-09-24 14:01:10

标签: c# linq

我正在使用System.Linq.Dynamic提供对大量数据库源(SQL服务器)的动态查询,这一切都运行得很好,但现在我遇到了麻烦。我需要能够获取两个数字列并将它们格式化为单个字符串。本质上归结为我正在做这样的事情(注意,这不是我正在做的事情,因为整个事情是动态的,传递给Select的实际字符串是动态构建的):

var mystuff = data.Select("year, qtr, string.Format(\"{0}Q{1}\",year,qtr) as yearQtr");

令人惊讶的是,System.Linq.Dynamic实际上似乎按照我的意愿解释了这一点,但不幸的是,它引发了System.ArgumentException错误:

Expression of type 'System.Int16' cannot be used for parameter of type 'System.Object' 
of method 'System.String Format(System.String, System.Object, System.Object)'

认为问题在于它不会像通常使用fact.year时那样自动装箱System.Int16(类型为string.Format)。那么有没有办法告诉它yearqtr

我尝试简单地转换为object,但这不起作用:

var mystuff = data.Select("year, qtr, string.Format(\"{0}Q{1}\",(object)year,(object)qtr) as yearQtr");

An exception of type 'System.Linq.Dynamic.ParseException' occurred in JobsEQ.Web.dll but was not handled in user code

Additional information: '.' or '(' expected

显然动态linq不懂铸造。

更新:我突然想到ToString()他们:

var mystuff = data.Select("year, qtr, string.Format(\"{0}Q{1}\",year.ToString(),qtr.ToString()) as yearQtr");

但是现在我得到一个不同的例外(System.NotSupportedException)让我觉得我走错了路:

LINQ to Entities does not recognize the method 'System.String Format(System.String, System.Object, System.Object)' method, and this method cannot be translated into a store expression.

那么还有另一种方法可以将这两列转换为单个字符串列吗?

1 个答案:

答案 0 :(得分:1)

只需在应用程序端执行字符串操作,而不是尝试在数据库端执行此操作。如您所见,即使动态LINQ可以创建表达式树来表示对Format的调用,EF也不知道如何将其转换为SQL。

而是简单地向数据库询问您需要的列,然后使用LINQ to对象在应用程序端执行这些值的字符串转换。