代码之家  ›  专栏  ›  技术社区  ›  Chris Klepeis

C lambda问题

  •  2
  • Chris Klepeis  · 技术社区  · 16 年前

    可能是一些简单的东西,但由于我对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 回复  |  直到 16 年前
        1
  •  3
  •   Reed Copsey    16 年前

    如果您收到 InvalidOperationException ,最可能的原因是有多个记录符合您的条件。

    Queryable.Single 将提高 无效操作异常 如果有多个正确的值。在这种情况下,尝试使用 .First(m => ..) 而是:

    myRepository.First(m => 
          m.contactID == contactID && 
          m.primaryAddress == true && 
          (m.addressTypeID == 2 || m.addressTypeID == 3)
        );
    

    如果有多个匹配结果,则返回第一个匹配结果。如果你不需要处理任何匹配的问题,那就调查一下 FirstOrDefault (如果没有匹配项,则返回空值)。

        2
  •  1
  •   Wallstreet Programmer    16 年前

    m.primaryAddress==true看起来可疑。M.PrimaryAddress真的是bool属性吗?

        3
  •  0
  •   msarchet    16 年前

    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,则移除

    在我写那个答案时重新发布的编辑操作

    我会这样写你的语法。

    Func Filter<var, bool> = m => (m.contactID == contactID && m.primaryAddress == true && (m.addressTypeID == 2 || m.addressTypeID == 3))

    然后通过过滤器进入 myrepository.Single(Filter)

        4
  •  0
  •   Kevin Le - Khnle    16 年前

    从您的SQL查询中,应该是:

    m => m.contactID == contactID && m.primaryAddress == 1 && (m.addressTypeID == 2 || m.addressTypeID == 3)