使用contains来匹配两个字段

时间:2014-08-20 15:40:22

标签: sql-server linq

我有一个数据库表,其中包含一组字段,其中一个名为Type,另一个名为Code。我还有一个封装在类中的TypeCode对的列表。像这样:

public class TypeAndCode
{
    public byte Type { get; set; }
    public int Code { get; set; }

    // overrides for Equals and GetHashCode to compare if Type and Code are equal
}

现在我需要做的是从表中只选择那些键入AND代码与我的集合中的条目匹配的条目。所以,例如,我尝试过这样的事情:

var query = myTable.Where(a => myTCList.Contains(new TypeAndCode() { Type = a.Type, Code = a.Code }).ToList();

但是它会给我一个NotSupportedException:

Unable to create a constant value of type 'TypeAndCode'. Only primitive types 
or enumeration types are supported in this context.

有没有办法让这项工作成功,以便我只能从数据库中检索CodeTypeCode和{{1}列表匹配的条目}}?我试图避免必须检索所有条目(它是一个大表)并在内存中匹配它们。

我知道我可以尝试像

这样的东西
Type

但是这会产生一些虚假的匹配,其中类型和代码来自我原始列表中的不同对。

3 个答案:

答案 0 :(得分:1)

您可以改为使用Any

var query = myTable
    .Where(a => myTCList.Any(t => t.Type == a.Type && t.Code == a.Code ))
    .ToList();

答案 1 :(得分:1)

您应该能够在没有类的重载方法的情况下手动执行此操作:

myTCList.Any(x => x.Type == a.Type && x.Code == a.Code)

答案 2 :(得分:0)

我的ulitmate解决方案,如果其他人遇到类似的问题,是设置一个临时表,我可以编写我想要匹配的对,我可以将它们与数据库表连接。在执行连接并实现结果后,您可以删除临时表。

类似的东西:

ctx.myTempTable = (from pair in mypairs
                   select new myTempTable() { Type = pair.Type, Code = pair.Code }).ToList();
ctx.SaveChanges();

var query = from q in myTable 
            join t in ctx.myTempTable
            on new { q.Type, q.Code } equals new { t.Code, t.Type }
            select q;

整件事情都在try / catch / finally块中,finally块用于清理临时表