linq lambda表达和'&'操作者

时间:2013-01-11 01:13:39

标签: c# linq

我正在开发一个ASP.NET MVC(旧版本)应用程序,我有一个表单,根据主要代码和学生姓氏的字母顺序为学生分配顾问。

我正在尝试实现以下代码,但它向&运算符显示红色涂鸦:

  

错误:运营商'&amp;'不能应用于类型为“System.Linq.IQueryable<Appointments.Models.MajorAdviserStudentAssignmentByAlpha>”和“lambda表达式”和“lambda表达式”的操作数

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;

我很感激任何帮助,以了解这里的错误。 提前谢谢!

4 个答案:

答案 0 :(得分:5)

我想在此处添加更正:实际上,{#1}} && 是C#中的布尔AND运算符<(与{一起使用时) {1}})。但是前者会做short-circuit evaluation

考虑&,如果boolA && B,那么A将不会被评估,因为无论{的真实性是什么,结果都是false {1}}。

对于你得到的错误,可能是因为你的B运算符正在比较布尔表达式和lambda表达式(函数)。试试这个

false

答案 1 :(得分:1)

那是因为您正在查看的运营商是&&。像这样重构你的Linq表达式

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;

答案 2 :(得分: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;

.Where()采用单个表达式返回bool。你正试图和两个不同的表达方式。如果你删除&&之前的括号括号,后面的第二个a =>的开括号,你就会找到两个布尔语句,它们可以工作。

答案 3 :(得分:-1)

我认为您打算使用&&进行逻辑AND操作。

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