Linq to SQL:将In-Memory元组列表数组与Table进行比较

时间:2017-05-23 21:30:58

标签: c# linq tuples

我需要将内存中的元组与表进行比较。我尝试使用以下查询,但它无法正常工作,

var tuples = new List<Tuple<string, int>>()
            {
                new Tuple<string, int>("12222",1),
                new Tuple<string, int>("12222",2)
            };

var result = Context.infotable
      .Where(i => tuples.Any(t => t.Item1 == i.col1 && t.Item2 == i.col2)
      .ToList();

抛出以下异常:

  

无法创建类型的常量值   'System.Tuple`2 [[System.String,mscorlib,Version = 4.0.0.0,   Culture = neutral,PublicKeyToken = b77a5c561934e089],[System.Int32,   mscorlib,版本= 4.0.0.0,文化=中性,   公钥= b77a5c561934e089]]”。只有原始类型或   在此上下文中支持枚举类型。

3 个答案:

答案 0 :(得分:0)

错误说Linq to SQL无法将使用Tuple类型的表达式转换为SQL构造。

您可以尝试以不同的方式构建查询,并提供PredicateBuilder

的一些帮助
String(i.channel)

如果元组列表大到足以导致SQL性能问题,我会特别注意。

答案 1 :(得分:0)

这是因为在查询中你使用的是元组。

作为示例,这种结构应该有效:

Selection does not contain a main type.

答案 2 :(得分:0)

我认为这意味着Tuple无法转换为SQL。我会从Tuple中分出类型并测试每个类型:

var t1s = tuples.Select(t => t.Item1).ToArray();
var t2s = tuples.Select(t => t.Item2).ToArray();
var result = Context.infotable
    .Where(i => t1s.Any(t1 => t1 == i.col1) && t2s.Any(t2 => t2 == i.col2))
    .ToList();

如果Any无法使用本地序列并且您必须使用Contains,那就不会让我感到惊讶:

var result = Context.infotable
    .Where(i => t1s.Contains(i.col1) && t2s.Contains(i.col2))
    .ToList();