类型int []不支持比较运算符 - linq to sql

时间:2014-12-02 15:46:55

标签: c# linq

这是有问题的一行:

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类型。

我无法弄清楚为什么它不会进行比较。这是延迟执行问题吗?它似乎不应该......

提前致谢。

2 个答案:

答案 0 :(得分:2)

List<T>.Contains只接受T类型的单个参数。在您的情况下,TInt32,但您传递的是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();