0
public List<Workflow> GetMyWorkflows(int[] MyRoles)
        {
            int[] myWorkflowIDs = new int[] { };
            RapidWorkflowDataContext context = new RapidWorkflowDataContext();
                var query = from w in context.WorkflowRoles
                            where MyRoles.Contains((int)w.RoleID)
                            select w.WorkflowID;
                var distinctWorkflows = query.Distinct();
                myWorkflowIDs = distinctWorkflows.toArray();
                return myWorkflowIDs;
        }

在这种方法中,我想检索用户可以访问的一组工作流。我收到以下错误:无法将类型 'int?[]' 隐式转换为 'int[]'

4

4 回答 4

1

我猜 WorkflowID 是 type int?。如果您确定它不能为空,请将您的中心查询更改为:

var query = from w in context.WorkflowRoles
                        where MyRoles.Contains((int)w.RoleID)
                        select w.WorkflowID.Value;

这将确保querynow 是 typeIEnumerable<int>而不是, 在and函数上IEnumerable<int?>具有int以下内容。Distinct()ToArray()

于 2013-08-14T13:27:22.067 回答
1

我想检索一系列工作流

但是您的方法必须返回 aList<Workflow>或 a List<int>

所以你应该跳过数组的想法。另一个问题是int和之间int?。您可以在 select 子句中使用select w.WorkflowID.Valueor解决这个问题select w.WorkflowID ?? 0。或者只是select w为了一个List<Workflow>.

此外,在上下文变得无法访问时处理它也是一个好主意。

    public List<int> GetMyWorkflows(int[] MyRoles)
    {
        using (RapidWorkflowDataContext context = new RapidWorkflowDataContext())
        {
           var query = from w in context.WorkflowRoles
                    where MyRoles.Contains((int)w.RoleID)
                    select w.WorkflowID ?? 0;
                    // select w;  to return a List<WorkFlow>

           var distinctWorkflows = query.Distinct();

           return distinctWorkflows.ToList();   // ToList because we are closing the Context
        }
    }
于 2013-08-14T13:27:23.287 回答
0

所以int?也可以写成Nullable<int>基本上是一个可以null取值的int。例如:

int? nullableNumber = 5;   // Set to a value
nullableNumber = null?     // Set to null (which is possible because int? is nullable).

正如您可以想象的那样,Nullable<int>它对数据库很有用,因为有时您可能有一个包含空值的列,因此这种类型提供了一种映射到这种值的有用方法。但问题在于,在您的代码中,您必须处理两种不同的类型,intint?. 您可以使用以下方法在两个值之间进行转换:

// If the nullable-integer is not-null then use it's value, else default to `0`.
int nonNullable = nullableNumber ?? 0; 

0如果值为空,它将用空值替换。或者您可以将您的值存储myWorkflowIDs在一个可为空的值(Nullable<int>[]int?[])中,这在语义上可以更好地反映数据库中的列值实际是什么。

于 2013-08-14T13:29:12.477 回答
0

这对我来说似乎是一个很好的错误

Cannot convert type 'int?[]' to 'int[]'

您必须有一个类型的数组int?并尝试将其隐式转换为int.

因此,您有两个选择 - 停止尝试隐式转换,并允许结果为int?[],如下所示:

int?[] myWorkflowIDs = new int?[] { };

或强制进行转换,如下所示:

RapidWorkflowDataContext context = new RapidWorkflowDataContext();
var query = from w in context.WorkflowRoles
        where MyRoles.Contains((int)w.RoleID)
        select (int)w.WorkflowID;
        // or w.WorkflowID ?? 0; as necessary
于 2013-08-14T13:29:32.893 回答