我正在尝试使用数组Concat方法将名为SearchDef.Column的类型的文字硬编码数组与我的类上的静态函数返回的数组相结合。静态函数也返回SearchDef.Column []。这是最终用户查询工具的基础,该工具将许多内置字段与最终用户定义的字段组合在一起。所以,我想将一个文字数组与一个函数返回的数组相结合,我希望该内容在内置字段和用户定义字段之间是无缝的。我遗漏了很多周围的代码,因为它很多,我认为这对问题没有帮助。
我熟悉了“你错过了演员?”当我使用Concat将静态函数的结果与文字数组相结合时出错。
无法隐式转换类型'System.Collections.Generic.IEnumerable< AdamOneilSoftware.SearchDef.Column>'到'AdamOneilSoftware.SearchDef.Column []'。存在显式转换(您是否错过了演员?)
这对我没有意义,因为主Columns属性(在顶部)是SearchDef.Column []类型。静态函数SearchDef.CustomFieldsFromQuery也返回SearchDef.Column [],所以我不明白为什么编译器将其称为IEnumerable。实际上我尝试直接转换CustomFieldsFromQuery的结果,但是留下了相同的错误。我也尝试将.ToArray()放在最后 - 没有变化。
我希望我已经提供了足够的源代码....尽量不要挂断字符串文字/ SQL片段。在他们自己中,他们不是问题。相反,它是某种阵列类型不匹配,我没有遵循。
Columns = new Column[] {
new Column("[p].[Number]", "Number"),
new Column("[p].[Name] AS [PatientName]", "Name"),
... ommisions for clarity ...
new Column("[mc].[Number] AS [Microchip]", "Microchip")
}.Concat(SearchDef.CustomFieldsFromQuery( // FAILS HERE
"SELECT [Name] AS [Header], 'dbo.Patient' + [ccft].[StorageColumn] + ... omitted for clarity
"WHERE [fd].[ClinicID]=@0 AND [fd].[ShowInSearchResults]=1 AND [fd].[IsActive]=1"));
以下是CustomFieldsFromQuery方法的代码:
public static Column[] CustomFieldsFromQuery(string query)
{
// query must return 3 columns: Header, Expression, ID and have a formatting placeholder {0} where the ID will be inserted into expression
Hs4Db db = new Hs4Db();
DataTable tbl = db.SelectTable(query, SqlDb.Params(db.CurrentClinicID), CommandType.Text);
return tbl.AsEnumerable().Select(dataRow => new Column(dataRow)).ToArray();
}
答案 0 :(得分:3)
Concat
会返回IEnumerable<AdamOneilSoftware.SearchDef.Column>
,您指定给它的Columns
属性可能是AdamOneilSoftware.SearchDef.Column[]
。
在.ToArray()
电话后附加Concat
,它会正常工作。
答案 1 :(得分:3)
我认为你误解了这个问题。
您正在尝试为其分配IEnumerable。您的代码是有效的:
Columns = (IEnumerable<Column>)someValue;
您应该将其更改为:
Columns = ((IEnumerable<Column>)someValue).ToArray();
将其放入您的代码中会给出:
Columns = new Column[] {
new Column("[p].[Number]", "Number"),
new Column("[p].[Name] AS [PatientName]", "Name"),
... ommisions for clarity ...
new Column("[mc].[Number] AS [Microchip]", "Microchip")
}.Concat(SearchDef.CustomFieldsFromQuery( // FAILS HERE
"SELECT [Name] AS [Header], 'dbo.Patient' + [ccft].[StorageColumn] + ... omitted for clarity
"WHERE [fd].[ClinicID]=@0 AND [fd].[ShowInSearchResults]=1 AND [fd]. [IsActive]=1"))
.ToArray() // Note the ToArray on the *outside*...;