获取类型不匹配/强制转换错误我不明白使用数组Concat时

时间:2014-08-04 14:32:17

标签: c# arrays linq

我正在尝试使用数组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();
    }

2 个答案:

答案 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*...;