这是有问题的一行:
var originalSummaryCandidates =
(from a in masterDB.tbl_thirty_second_summaries_multi_variant_associations
join d in masterDB.tbl_thirty_second_summaries_multi_variants on a.ThirtySecSummaryId equals d.ThirtySecondSummaryId_this
where d.DrugId == drugId &&
variantGenotypeIds.Contains(new int[] {a.VariantId, a.GenotypeId})
select d.ThirtySecondSummaryId_this)
.Distinct()
.ToList();
variantGeotpeIds的类型为List<int[]>
。 a.VariantId和a.GenotypeId都是int类型。
我无法弄清楚为什么它不会进行比较。这是延迟执行问题吗?它似乎不应该......
提前致谢。
答案 0 :(得分:2)
List<T>.Contains
只接受T
类型的单个参数。在您的情况下,T
为Int32
,但您传递的是Int32[]
。
如果要检查两个值是否在列表中,则必须将呼叫分开:
where d.DrugId == drugId &&
variantGenotypeIds.Contains(a.VariantId) &&
variantGenotypeIds.Contains(a.GenotypeId)
修改强>
如果variantGenotypeIds
实际上是List<Int32[]>
,那么还有另一个问题。 LINQ to SQL将尝试将您的查询转换为其SQL等价物。在这种情况下,无法将查询转换为SQL,因此LINQ to SQL将抛出异常。
如果你真的需要以这种方式查询,你必须首先将记录读入内存然后使用LINQ to Objects进行查询(这可能是也可能不是很大,取决于你正在阅读的行数):
var query =
from a in masterDB.tbl_thirty_second_summaries_multi_variant_associations
join d in masterDB.tbl_thirty_second_summaries_multi_variants
on a.ThirtySecSummaryId equals d.ThirtySecondSummaryId_this
where d.DrugId == drugId
select new { a, d }
var originalSummaryCandidates =
(from q in query.AsEnumerable()
where variantGenotypeIds.Contains(new [] { q.a.VariantId, q.a.GenotypeId})
select d.ThirtySecondSummaryId_this)
.Distinct()
.ToList();
答案 1 :(得分:0)
默认情况下,数组比较使用 reference 相等。它的可能 linq-to-sql只是尝试将其转换为比较值的SQL,但是您必须查看生成的SQL以确定。另一种选择是使用Any
代替:
where d.DrugId == drugId &&
variantGenotypeIds.Any(v => v[0] == a.VariantId && v[1] == a.GenotypeId)
但我不确定Linq-to-Sql是否能够将其转换为正确的SQL。另一个选择是将List`投影到&gt;然后进行字符串比较:
variantGenotypeStrings = variantGenotypeIds.Select(v => string.Format("{0}|{1}", v[0],v[1]);
var originalSummaryCandidates =
(from a in masterDB.tbl_thirty_second_summaries_multi_variant_associations
join d in masterDB.tbl_thirty_second_summaries_multi_variants on a.ThirtySecSummaryId equals d.ThirtySecondSummaryId_this
where d.DrugId == drugId &&
variantGenotypeStrings.Contains(string.Format("{0}|{1}", a.VariantId, a.GenotypeId))
select d.ThirtySecondSummaryId_this)
.Distinct()
.ToList();