【发布时间】:2017-04-19 15:50:10
【问题描述】:
我有一个带有两个主键的表(和 Dto):int 和 string 类型:
public class Foo
{
public int Id { get; set; }
public string Data { get; set; }
// other members...
}
所以,我有一个List<Dto> dtoList,它是从一个 DbContext 中获得的。我需要在其他 DbContext 中获得相同的 dto。问题是 PK 是一对两列。
我是这样做的(似乎它不起作用):
public IEnumerable<FooDto> GetFooByPrimaryKeys(List<int> ids, List<string> data)
{
return FooContext.Foo.Where(f => ids.Contains(f.Id) && data.Contains(f.Data));
}
但它会返回我需要的更多行。我的意思是,我通过了 1300 多对并获得了 1500 多 dto,所以有些不对劲。
我不确定我是否采取了正确的方法。
【问题讨论】:
-
The problem is that the PK is a pair of two columns.- 如果这与您的问题有关,您能否对此进行扩展以及为什么会出现问题?您的解决方案如何解决这个问题? -
我想知道这是否可行
var compound = ids.Zip(data, (i,d) => new{Id = i, Data=d}).ToList(); return FooContext.Foo.Where(f => compound.Contains(new{f.Id, f.Data})); -
虽然问题很明显,但考虑到您传入的列表的大小,如果不编写自己的 Sql,我看不到一个简单的解决方法。问题是您正在对任一列表进行 OR 匹配当您应该对元组(一组键)进行 AND 操作时。我不确定是否可以将其转换为 EF 存储查询而无需编写一些手动 sql。
-
事情是你不能轻易地用 EF 做到这一点,因为你需要一个连接,你不能只连接 EF 中的内存结构。
标签: c# sql .net entity-framework lambda