C#Lambda问题

时间:2010-06-15 20:38:23

标签: c# lambda

可能是简单的事情,但由于我是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));

4 个答案:

答案 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)