LINQ DefaultIfEmpty(),生成推断参数错误

时间:2010-04-21 16:40:09

标签: c# .net linq

如果没有任何当前值,我试图让以下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);
        }
    }

2 个答案:

答案 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;
    }
}