2

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

我正在尝试实现以下代码,但它向&操作员显示红色涂鸦:

错误:运算符“&”不能应用于“ 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

4 回答 4

5

我想在这里添加一个更正:实际上两者&& & 都是C# 中的布尔 AND 运算符(与 一起使用时bool)。但是前者会进行短路评估

考虑一下A && B,如果AfalseB不会被评估,因为false无论真实性如何,结果都将是B

对于您遇到的错误,可能是因为您的&运算符正在比较布尔表达式和 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;
于 2013-01-11T01:21:09.073 回答
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;
于 2013-01-11T01:16:36.170 回答
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() takes a single expression returning bool. You are trying to and together two different expressions. If you remove the close parentheses before the &&, the open parentheses after and the second a =>, you're anding two boolean statements, which works.

于 2013-01-11T01:21:45.633 回答
-1

我认为您&&的意思是用于逻辑 AND 操作。

FirstOrDefault()也需要 aFunc<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));
于 2013-01-11T01:16:28.077 回答