2010-04-21 50 views
1

我想获得下面的linq查询返回-1如果没有任何当前值。我在MSDN上看到这篇文章,here,它似乎DefaultIfEmpty()是我想要的。LINQ 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

'applicationAssociation.PersonApplicationID'是什么类型?它是一个'int'还是一个可空的? – 2010-04-21 16:44:59

+0

'PersonApplicationID'是一个'string' – 2010-04-21 16:46:29

+0

为什么你会在一个字符串中存储一个ID?错误的数据库设计,你不能改变? – 2010-04-21 17:10:46

回答

2

-1是一个int和applicationAssociation.PersionApplicationID是没有,所以它不知道该怎么回报。您可以使用与applicationAssociation.PersionApplicationID“-1”相同的类型替换-1。或者指定类型如DefaultIfEmpty<string>。第三个选项是在select中执行Convert.ToInt32

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

我刚刚创建associactions的样本集,因为我没有你的DataContext。顺便说一下:你可以声明masterIndexint,因为你知道表达式将返回的类型,所以你不需要var

因此,您的问题的原因在于别的地方:PersonApplicationID字段不是int,因此编译器不知道通用函数DefaultIfEmpty应推断哪种类型。

更新: 刚试过上面的例子与PersonApplicationID属性设置为:

  • new Nullable<int>(1):抛出“无法隐式转换类型'诠释?到“廉政”“
  • 1f:抛出‘无法隐式转换类型‘浮动’到‘廉政’’
  • "":抛出”的方法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; 
    } 
}