类型不支持 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 类型。

我不知道为什么它不会进行比较。这是延迟执行问题吗?好像不应该...

提前谢谢。

类型不支持 int[] - Linq to SQL 的比较运算符

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();