可能是简单的事情,但由于我是lambda表达的新手,这个问题会让我感到厌烦:
m => m.contactID == contactID && m.primaryAddress == true && (m.addressTypeID == 2 || m.addressTypeID == 3)
我尝试使用该lambda表达式,但收到一个无效的运算符。有没有办法简化这个以便它可以工作?
修改
等效的sql查询将是:
SELECT *
FROM Contact
WHERE contactID = 3
AND primaryAddress = 1
AND (addressTypeID = 2 OR addressTypeID = 3)
我有一个如此定义的存储库函数:
public E Single(Expression<Func<E, bool>> where)
{
return objectSet.Single<E>(where);
}
我将上面的lambda表达式传递给这个函数:
myRepository.Single(m => m.contactID == contactID && m.primaryAddress == true && (m.addressTypeID == 2 || m.addressTypeID == 3));
答案 0 :(得分:3)
如果您收到InvalidOperationException
,最可能的原因是有多条记录符合您的条件。
Queryable.Single会引发InvalidOperationException
。在这种情况下,请尝试使用.First(m => ..)代替:
myRepository.First(m =>
m.contactID == contactID &&
m.primaryAddress == true &&
(m.addressTypeID == 2 || m.addressTypeID == 3)
);
如果有多个匹配结果,则返回第一个匹配结果。如果您不需要处理匹配项,请查看FirstOrDefault(如果没有匹配项将返回null)。
答案 1 :(得分:1)
m.primaryAddress == true看起来很可疑。 m.primaryAddress真的是bool属性吗?
答案 2 :(得分:0)
m => (m.contactID == contactID && m.primaryAddress == true && (m.addressTypeID == 2 || m.addressTypeID == 3))
只是一个布尔表达式。
你需要做类似的事情
list.Remove(m => (m.contactID == contactID && m.primaryAddress == true && (m.addressTypeID == 2 || m.addressTypeID == 3)))
等
这表示我的列表中的每个项目都为m
如果返回true,请删除m
在我写回答时重新发布OP
我会像你的语法一样写这个。
Func Filter<var, bool> = m => (m.contactID == contactID && m.primaryAddress == true && (m.addressTypeID == 2 || m.addressTypeID == 3))
然后将过滤器传递到myrepository.Single(Filter)
答案 3 :(得分:0)
从您的SQL查询中,它应该是:
m => m.contactID == contactID && m.primaryAddress == 1 && (m.addressTypeID == 2 || m.addressTypeID == 3)