【问题标题】:Linq: the best overloaded match has some invalid argumentsLinq:最好的重载匹配有一些无效的参数
【发布时间】:2016-01-24 01:06:08
【问题描述】:

我执行 linq to sql 查询以获取列表:

var list1 = db.Table1.Where(a => a.item == "Widgets").ToList();

现在我想使用上面列表的结果从另一个表中获取一个列表:

var list2 = db.Table2.Where(a => list1.Contains(a.GUID)).ToList();

到目前为止,这一切都按预期工作。

现在我想做一个查询,在其中找到另一个数据库表中的所有行,这些行具有我的 list2 中的 GUID

var list3 = db.MyTable.Where(a => list2.Contains(a.GUID)).ToList();

三个表中的数据类型都相同,所以我知道它们匹配。但是我得到最好的重载匹配有一些无效的参数?

【问题讨论】:

  • 你能发布确切的例外吗?
  • 错误 12 'System.Collections.Generic.List.Contains(Test1.Data.Models.Table1)' 的最佳重载方法匹配有一些无效参数
  • 然后说:错误 13 参数 1:无法从 'long' 转换为 'Test1.Data.M‌​odels.Table1' 但我所有的字段类型在模型类中都很长(在 db 中它们是大整数)
  • 我建议你不要使用var,而是使用真正的类型,这样你应该知道问题是什么了。我很惊讶var list2 = ... 甚至可以工作,因为 list1 不应该是 List,但 list1.Contains(someLong) 可以工作...
  • 我编辑了我的答案,这应该可以解释为什么您的代码不起作用以及如何更轻松地深入研究它。如果这解释并解决了您的问题,请接受。 :)

标签: linq linq-to-sql


【解决方案1】:

您在第三行中缺少 Where 子句:

var list3 = db.MyTable.Where(a => list2.Contains(a.GUID)).ToList();

编辑:好的,这只是一个类型,问题已被编辑,请参阅下面的新答案。


查看您的异常

System.Collections.Generic.List.Contains(Test1.Data.M‌​odels.Table1)' 有一些无效参数

我们可以看到 list2 的类型是 List<Test1.Data.Models.Table1>,但您尝试运行 list2.Contains(long)。你必须改变

var list2 = db.Table2.Where(a => list1.Contains(a.GUID)).ToList();

var list2 = db.Table2.Where(a => list1.Contains(a.GUID)).Select(a => a.GUID).ToList();

那么list2的类型应该是List。

我个人不太喜欢var,因为您无法从源代码中提取变量的确切类型。如果您将 vars 更改为“真实”数据类型,您可能会更容易发现问题。

【讨论】:

  • 这是问题中的错字(感谢您看到它)。我编辑了这个问题。最初的问题还是一样。
  • 是的——按照你说的做,我会将正确的类型传递给 list3 查询中的 lambda。对我来说,我确实需要 list2 中的其余字段,所以我只是按照你说的做,但我得到了完整的 list2 供我使用,而且我还得到了 Select(a => a.GUID) 就像你说的那样,通过快速执行 myGUIDs = list2.Select(x => x.GUID).ToList()。所以现在我将 myGUIDs 作为列表而不是 list2 用于我的 list3 查询,一切都很好。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-07
  • 2015-10-14
  • 2018-07-14
  • 2014-04-14
相关资源
最近更新 更多