if..if-else..else..in linq to对象
给定一个包含多行的DataView,我想根据以下条件提取一行:if..if-else..else..in linq to对象,linq,conditional,Linq,Conditional,给定一个包含多行的DataView,我想根据以下条件提取一行: 如果一行以某个字符串开头,以某个字符串结尾,则在所有其他行之前选择该行 如果没有行符合第一个条件,那么只需查找以特定字符串开头的行 如果无法匹配上述任何一项,则默认为null 我的快速尝试只是返回满足任何条件的第一行(请原谅,如果VB语法不正确,我不太熟悉) 编辑:我想补充一点,像这样的东西看起来很有希望,但我认为在我的情况下它不会起作用。如果我错了,请随时更正。在查询中表达这种算法即使不是不可能,也是很困难的。查询将仅独立于其
- 如果一行以某个字符串开头,以某个字符串结尾,则在所有其他行之前选择该行
- 如果没有行符合第一个条件,那么只需查找以特定字符串开头的行
- 如果无法匹配上述任何一项,则默认为null
编辑:我想补充一点,像这样的东西看起来很有希望,但我认为在我的情况下它不会起作用。如果我错了,请随时更正。在查询中表达这种算法即使不是不可能,也是很困难的。查询将仅独立于其他行来判断每一行。 您需要先获得第一个条件的结果集,然后才能检查第二个条件 在我看来,您需要执行三个单独的查询(如果返回任何结果,可能只执行第一个查询,因为此时您满足了第一个条件,不需要检查其他结果)。 另一种方法是,我猜,通过对数据进行某种排序,但最终可能会出现不太清晰、性能较差的结果
在任何情况下,对于普通人来说,你的代码的可读性都会提高一百倍,即使有一种方法可以在查询中表达你的需求。存在过度使用Linq;) 我也这么怀疑。我只是想确认一下。我只是不确定是否有一些扩展方法或linq魔术是适用的,但仍然使一个看似复杂的查询像我所希望的那样工作,并使其对普通人可读:)将其拆分为两个查询(带注释)使其可读,而不是笨重。我并不打算在任何情况下都使用linq作为我的锤子,但我认为在dataview上进行过滤和多个for循环会更好。这两个问题似乎很有效。
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()