如何将查询结果分配给整数数组

时间:2013-08-14 13:24:20

标签: c# linq linq-to-sql

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 个答案:

答案 0 :(得分:1)

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

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

这将确保query现在属于IEnumerable<int>类型,而不是IEnumerable<int?>int和{{1}后跟Distinct()函数。

答案 1 :(得分:1)

  

我想检索一系列工作流程

但您的方法必须返回List<Workflow>List<int>

所以你应该跳过数组的想法。另一个问题是在intint?之间。您可以使用select w.WorkflowID.Valueselect w.WorkflowID ?? 0在select子句中解决此问题。或者只是select w的{​​{1}}。

当一个上下文无法访问时,最好配置一个上下文。

List<Workflow>

答案 2 :(得分: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; 

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

答案 3 :(得分: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