我需要将内存中的元组与表进行比较。我尝试使用以下查询,但它无法正常工作,
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]]”。只有原始类型或 在此上下文中支持枚举类型。
答案 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();