if..if else..else..in linq to objects

时间:2011-12-07 07:19:57

标签: linq conditional

鉴于DataView包含多行,我想根据以下标准提取一行;

  • 如果一行以某个字符串开头并以某个字符串结尾,则在所有其他字符串上方选择该行
  • 如果没有符合第一个条件的行,那么只需查找以某个字符串
  • 开头的行
  • 如果我们无法匹配上述任何一项,则默认为null。

我的快速尝试只返回符合任何条件的第一行(对不起,如果VB语法不正确,我对它不熟悉);

  Dim result = (From row In dv.Table.Rows() _
                Where (GetString(row, "id").StartsWith(Me.ID.Substring(0, 3), StringComparison.OrdinalIgnoreCase) AndAlso _
                GetString(row, "id").EndsWith(Me.ID.Substring(Me.RegisteredID.Length - 2, 2), StringComparison.OrdinalIgnoreCase)) OrElse _
                GetString(row, "id").StartsWith(Me.ID.Substring(0, 3), StringComparison.OrdinalIgnoreCase) _
                Select row).FirstOrDefault()

编辑:我想补充说像https://stackoverflow.com/a/443055/685760这样的东西看起来很有希望,但我不认为它会在我的情况下起作用。如果我错了,请随意纠正我。

1 个答案:

答案 0 :(得分:1)

如果不是不可能的话,在查询中表达这种算法将是困难的。查询将仅与其他行无关地判断每一行。 在检查第二个标准之前,您需要具有第一个条件的结果集...

在我看来,你需要做三个单独的查询(如果它返回任何结果,可能最终只会执行第一个查询,因为那时你达到了你的第一个标准而不需要检查其他结果) 。 另一种方式是,我想,通过某种数据排名,但你可能会得到一些不那么清晰且性能较差的东西。

在任何情况下,即使有办法在查询中表达您的需求,您的代码对普通凡人的可读性也会高出一百倍。有过度使用Linq的事情;)