我正在开发一个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;
我很感激任何帮助,以了解这里的错误。 提前谢谢!
答案 0 :(得分:5)
我想在此处添加更正:实际上,{#1}} 和 &&
是C#中的布尔AND运算符<(与{一起使用时) {1}})。但是前者会做short-circuit evaluation:
考虑&
,如果bool
为A && 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));