如果没有任何当前值,我试图让以下linq查询返回-1
。我在MSDN上查看了这篇文章here,似乎DefaultIfEmpty()
就是我想要的。
不幸的是,我收到The type arguments cannot be inferred from the usage. Try specifying the type arguments explicitly.
错误。
我想我不确定这意味着什么或它告诉我做什么。有人可以解释一下。
public static int CheckForDRIID(int personID)
{
using (var context = ConnectDataContext.Create())
{
var masterIndex =
(from applicationAssociation in context.tblApplicationAssociations
where applicationAssociation.ApplicationID == 1 && applicationAssociation.PersonID == personID
select applicationAssociation.PersonApplicationID).DefaultIfEmpty(-1).Single();
return Convert.ToInt32(masterIndex);
}
}
答案 0 :(得分:2)
-1是一个int而applicationAssociation.PersionApplicationID
不是,因此它不知道返回什么。您可以使用与applicationAssociation.PersionApplicationID
,“ - 1”相同的类型替换-1。或者指定类似DefaultIfEmpty<string>
的类型。第三个选项是在选择中执行Convert.ToInt32
。
答案 1 :(得分:1)
该代码适用于我:
public static int CheckForDRIID(int personID)
{
var someAssociaction = new { ApplicationID = 1, PersonID = 1, PersonApplicationID = 1 };
var associactions = (new[] { someAssociaction }).ToList();
associactions.Add(new { ApplicationID = 2, PersonID = 2, PersonApplicationID = 2 });
int masterIndex =
(from applicationAssociation in associactions
where applicationAssociation.ApplicationID == 1 && applicationAssociation.PersonID == personID
select applicationAssociation.PersonApplicationID).DefaultIfEmpty(-1).Single();
return masterIndex;
}
我刚刚创建了一组示例关联,因为我没有你的datacontext。顺便说一下:你可以只声明masterIndex
int
,因为你知道表达式会返回的类型,所以你不需要var
。
因此问题的原因在于其他地方:PersonApplicationID
字段不是int
,因此编译器不知道它应该为通用函数DefaultIfEmpty
推断出哪种类型。
<强>更新强>
刚试过上面的例子,将PersonApplicationID
属性设置为:
new Nullable<int>(1)
:抛出“无法隐式转换类型'int?'到'int'“ 1f
:抛出“无法将类型'float'隐式转换为'int'” ""
:抛出“方法DefaultIfEmpty<TSource>
的类型参数无法从用法中推断出来。请尝试明确指定类型参数。” 因此,我假设您在数据库的PersonApplicationID
字段中存储字符串。如果是这样,请更改数据库,或将字符串解析为Linq查询中的int:
public static int CheckForDRIID(int personID)
{
using (var context = ConnectDataContext.Create())
{
int masterIndex =
(from applicationAssociation in context.tblApplicationAssociations
where applicationAssociation.ApplicationID == 1 && applicationAssociation.PersonID == personID
select int.Parse(applicationAssociation.PersonApplicationID)).DefaultIfEmpty(-1).Single();
return masterIndex;
}
}