我正在使用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
)。那么有没有办法告诉它year
和qtr
?
我尝试简单地转换为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.
那么还有另一种方法可以将这两列转换为单个字符串列吗?
答案 0 :(得分:1)
只需在应用程序端执行字符串操作,而不是尝试在数据库端执行此操作。如您所见,即使动态LINQ可以创建表达式树来表示对Format
的调用,EF也不知道如何将其转换为SQL。
而是简单地向数据库询问您需要的列,然后使用LINQ to对象在应用程序端执行这些值的字符串转换。