【问题标题】:subquery in query contains query element linq not working查询中的子查询包含查询元素 linq 不起作用
【发布时间】:2015-07-31 03:28:27
【问题描述】:

大家好
我有两个 Linq 查询如下

var sub_query = from x in db.table
where 
     x.item1 == "abcd"
select new
{ 
   x.Item2 //is a string
}

var query = from y in db2.table
            where
                 sub_query.ToList().Contains(new {y.item2}) //error here 
            select new { y.element }

这行不通
它无法识别 y 中的任何内容并引发匿名错误
y.item2 is a string 我也直接尝试了sub_query.Containsinsidequery,但同样的错误
编辑(给出错误)

最好的重载方法匹配 'System.Collections.Generic.List.Contains(AnonymousType#1)' 有一些无效的参数

PS : 当我构建解决方案时,错误消失了,例如,如果删除逗号 (;) 并添加一个新的逗号,错误又回来了

【问题讨论】:

  • 错误信息到底是什么?

标签: c# linq


【解决方案1】:

您创建的匿名对象实际上并不相等。见以下代码:

string myString = "foo";
string myOtherString = "foo";

var x = new { myString };
var y = new { myOtherString };

x.Equals(y) 将返回 false,您对 Contains 的调用也将返回 false。

如果您直接选择字符串而不是将其包装在匿名对象中,它应该可以工作。例如:

select x.Item2

sub_query.ToList().Contains(y.item2)

【讨论】:

  • 它有效,但我不明白。如果它们是相同的类型,并且我们说相同的值,为什么它不起作用?
  • 匿名类型的 .Equals() 的实现在其所有内部对象上使用 == 而不是 .Equals() (对于字符串,引用相等,而不是值相等)。在我的示例中,myString == myOtherString 返回 false,但 myString.Equals(myOtherString) 返回 true。匿名类型在其 .Equals() 方法中使用 == 比较。
猜你喜欢
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多