我有一个数据库表,其中包含一组字段,其中一个名为Type
,另一个名为Code
。我还有一个封装在类中的Type
和Code
对的列表。像这样:
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.
有没有办法让这项工作成功,以便我只能从数据库中检索Code
和Type
与Code
和{{1}列表匹配的条目}}?我试图避免必须检索所有条目(它是一个大表)并在内存中匹配它们。
我知道我可以尝试像
这样的东西Type
但是这会产生一些虚假的匹配,其中类型和代码来自我原始列表中的不同对。
答案 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
块用于清理临时表