2013-01-11 55 views
2

我工作的一个ASP.NET MVC(旧版本)的应用程序,我有,学生被赋予基于主代码,并通过学生的最后阿尔法顾问形式名称。LINQ lambda表达式和“&”操作

我想实现下面的代码,但它显示给操作者&红色的涂鸦:

Error: operator '&' cannot be applied to operands of type ' System.Linq.IQueryable<Appointments.Models.MajorAdviserStudentAssignmentByAlpha> ' and 'lambda expression' and 'lambda expression'

var majorAssignmentByAlpha = FindAllMajorAdviserStudentAssignmentByAlphas() 
    .Where(
      a => a.MajorString == student.StudentMajor) & 
      (a => ((String.Compare(student.StudentLastName, a.AlphaStart) >= 0) & 
       (String.Compare(student.StudentLastName, a.AlphaEnd) <= 0)) 
    .FirstOrDefault()); 

if (majorAssignmentByAlpha != null) 
    return majorAssignmentByAlpha.Adviser; 

我希望得到任何帮助,了解什么是错在这里。 在此先感谢!

+0

以下称'&'是按位经营和''&&是逻辑的答案是错的。 '&'既可以是按位也可以是逻辑的,但如果是逻辑的,则始终执行双方。如果左半部分是假的,'&&'跳过右半部分。 – TheEvilPenguin

回答

5

我想在这里补充修正:其实两者&&&在C#中布尔AND运算符(带有bool使用时)。然而前者会做short-circuit evaluation

考虑A && B,如果Afalse然后B将不进行评估,因为其结果将是false不管是B的truthness。

而对于你所得到的错误,很可能是因为您的&算比较布尔表达式和lambda表达式(函数)。试试这个

MajorAdviserStudentAssignmentByAlpha majorAssignmentByAlpha = FindAllMajorAdviserStudentAssignmentByAlphas().FirstOrDefault(
     a => a.MajorString == student.StudentMajor & String.Compare(student.StudentLastName, a.AlphaStart) >= 0 & 
      String.Compare(student.StudentLastName, a.AlphaEnd) <= 0); 

    if (majorAssignmentByAlpha != null) 
     return majorAssignmentByAlpha.Adviser; 
+2

考虑翻转答案的位置和补充说明。 – 2013-01-11 01:33:50

+0

感谢格式编辑:) – rexcfnghk

+0

@rexcfnghk:谢谢!我用了你的代码稍稍编辑括号内的 'a.AlphaEnd' 后,像: MajorAdviserStudentAssignmentByAlpha majorAssignmentByAlpha = FindAllMajorAdviserStudentAssignmentByAlphas()FirstOrDefault( A => a.MajorString == student.StudentMajor&String.Compare(student.StudentLastName ,a.AlphaStart)> = 0& String.Compare(student.StudentLastName,a.AlphaEnd)<= 0); if(majorAssignmentByAlpha!= null) return majorAssignmentByAlpha.Adviser; 希望它是正确的,至少它不会给我一个错误信息。 – Gregg

-1

我想你的意思是使用&&的逻辑与操作。

FirstOrDefault()也需要Func<T, bool>,所以你可以这样做:

var majorAssignmentByAlpha = FindAllMajorAdviserStudentAssignmentByAlphas().FirstOrDefault(
      a => a.MajorString == student.StudentMajor && 
      (a => ((String.Compare(student.StudentLastName, a.AlphaStart) >= 0) && 
       (String.Compare(student.StudentLastName, a.AlphaEnd) <= 0)); 
+0

虽然'&&'可能是这里应该使用的,它只会快速评估第二个操作数。 '&'可以是按位或逻辑。 – TheEvilPenguin

+0

@ TheEvilPenguin:虽然你是对的,但我在OP的问题中回答了这个问题,这就是为什么我没有提及这一点。 –

+1

对不起,由于代码仍然没有编译我,我做了一个假设。 – TheEvilPenguin

1

那是因为你正在寻找它的运营商&&。重构你的Linq expresssion这样

MajorAdviserStudentAssignmentByAlpha majorAssignmentByAlpha = FindAllMajorAdviserStudentAssignmentByAlphas().Where(
     a => a.MajorString == student.StudentMajor) && 
     (a => ((String.Compare(student.StudentLastName, a.AlphaStart) >= 0) && 
      (String.Compare(student.StudentLastName, a.AlphaEnd) <= 0)).FirstOrDefault()); 

    if (majorAssignmentByAlpha != null) 
     return majorAssignmentByAlpha.Adviser; 
+0

请参阅我上面的评论。 '&'可以是逻辑或按位。 – TheEvilPenguin

+0

其实我跟你意见表示同意,但我认为,在这种情况下,他在寻找这个操作符 – Jorge

+1

对不起,我以为那是你的意思,因为这代码不能编译,我 - 它仍然试图逻辑和布尔和拉姆达。 – TheEvilPenguin

0

我觉得你加了太多括号。试试这个:

MajorAdviserStudentAssignmentByAlpha majorAssignmentByAlpha = FindAllMajorAdviserStudentAssignmentByAlphas().Where(
      a => a.MajorString == student.StudentMajor && 
       String.Compare(student.StudentLastName, a.AlphaStart >= 0) & 
       String.Compare(student.StudentLastName, a.AlphaEnd <= 0)).FirstOrDefault(); 

if (majorAssignmentByAlpha != null) 
    return majorAssignmentByAlpha.Adviser; 

。其中()取单个表达式返回bool。你正试图和两个不同的表达。如果删除&&之前的第二个圆括号和第二个a =>之前的圆括号,那么可以使用两个布尔语句。

+0

由于某种原因,当我试图执行你的代码显示红色涂鸦为'FirstOrDefault()'(错误:'bool'doe s不包含'FirstOrDefault'的定义,并且没有找到接受类型'bool'的第一个参数的扩展方法'FirstOrDefault'(你是否缺少使用指令或程序集引用)。 不好意思问你关于这个版本是不是写了'FirstOrDefault' – Gregg

+0

@Gregg Fixed。对不起,它在LINQPad中有效,但我在复制时一定会犯错误。我有不匹配的括号 – TheEvilPenguin