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 []'
答案 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>
。
所以你应该跳过数组的想法。另一个问题是在int
和int?
之间。您可以使用select w.WorkflowID.Value
或select 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>
对数据库非常有用,因为有时您可能会有一个具有空值的列,因此这种类型提供了映射到此类值的有用方法。但问题是,在您的代码中,您必须处理两种不同的类型int
与int?
。您可以使用以下方法在两个值之间进行转换:
// 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