类型不支持 int[] - Linq to SQL 的比较运算符
本文关键字:SQL to 比较 运算符 Linq 不支持 int 类型 | 更新日期: 2023-09-27 18:32:45
这是有问题的行:
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();
变体GeotpeIds的类型为List<int[]>
。a.VariantId 和 a.GenotypeId 都是 int 类型。
我不知道为什么它不会进行比较。这是延迟执行问题吗?好像不应该...
提前谢谢。
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 Object 进行查询(根据您正在读取的行数,这可能很重要,也可能不是什么大问题):
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();
默认情况下,数组比较使用引用相等性。 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' 投影到>,然后进行字符串比较:
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();