C# SQL双精度';在';lambda表达式中的子句

C# SQL双精度';在';lambda表达式中的子句,c#,sql,.net,entity-framework,lambda,C#,Sql,.net,Entity Framework,Lambda,我有一个带有两个主键的表(和Dto):int和string类型: public class Foo { public int Id { get; set; } public string Data { get; set; } // other members... } 因此,我有一个列表dtoList,它来自一个DbContext。我需要在其他DbContext中获得相同的DTO。问题是PK是一对两列 以下是我是如何做到这一点的(而且似乎不起作用): public I

我有一个带有两个主键的表(和Dto):
int
string
类型:

public class Foo
{
    public int Id { get; set; }
    public string Data { get; set; }

    // other members...
}
因此,我有一个
列表dtoList
,它来自一个DbContext。我需要在其他DbContext中获得相同的DTO。问题是PK是一对两列

以下是我是如何做到这一点的(而且似乎不起作用):

public IEnumerable GetFooByPrimaryKeys(列表ID、列表数据)
{
返回FooContext.Foo.Where(f=>ids.Contains(f.Id)和&data.Contains(f.data));
}
但它会返回更多我需要的行。我的意思是,我通过了1300双,得到了1500双,所以有些不对劲


我不确定我是否采取了正确的方法。

您需要将唯一的
int
s和
string
s对传递给该方法。不需要传入两个单独的列表,您可以传入一个带有元组的列表:

public IEnumerable<FooDto> GetFooByPrimaryKeys(List<Tuple<int, string>> keys)
{
    return FooContext.Foo.Where(f => keys.Any(x => x.Item1 == f.Id && x.Item2 == f.Data));
}
public IEnumerable GetFooByPrimaryKeys(列表键)
{
返回FooContext.Foo.Where(f=>keys.Any(x=>x.Item1==f.Id&&x.Item2==f.Data));
}
如果实体框架无法处理此问题,您可以选择获取所有记录,然后过滤内存中已实现记录的列表:

public IEnumerable<FooDto> GetFooByPrimaryKeys(List<Tuple<int, string>> keys)
{
    return FooContext.Foo.ToList().Where(f => keys.Any(x => x.Item1 == f.Id && x.Item2 == f.Data));
}
public IEnumerable GetFooByPrimaryKeys(列表键)
{
返回FooContext.Foo.ToList(),其中(f=>keys.Any(x=>x.Item1==f.Id&&x.Item2==f.Data));
}

如果你有很多记录,你可能需要考虑写一个存储过程:


无论如何,这里的主要问题是您需要与成对的值进行比较。

方法中的参数似乎没有将复合键视为复合键

GetFooByPrimaryKeys(列表ID){…}

这会给你你要找的钥匙对

然后
.Where(f=>ids.Contains(新元组(f.Id,f.Data))…


注意:我还没有尝试过这段代码,不确定它是否与EF的lambda引擎兼容。这可能是一个很好的开始。

问题是PK是一对两列。
-如果这与您的问题有关,您能否对此展开讨论,以及为什么会出现问题?您的解决方案是如何解决这个问题的?我想知道这是否有效
var component=ids.Zip(data,(I,d)=>new{Id=I,data=d}).ToList();返回FooContext.Foo.Where(f=>component.Contains(new{f.Id,f.Data}))尽管问题很明显,但考虑到您要传递的列表的大小,如果不编写自己的Sql,我看不到一个简单的解决方案。问题是,当您应该在元组(一组键)上执行AND时,您正在任一列表上执行OR匹配。我不确定不需要编写一些手动sql就可以将其转换为EF存储查询。问题是,使用EF很难做到这一点,因为你需要一个连接,而你不能只使用EF中的内存结构进行连接。当我读到这篇文章时,我也在想同样的事情,但是EF是否正确地将其转换为正确的数据存储表达式?EF是否会将其转换为有效的sql查询?我对此表示怀疑。请参阅我编辑的答案。很遗憾,我无法编写SP,但我将尝试其他两种解决方案。我认为获取所有项目并在内存中进行“计算”并不是那么简单idea@MarkC.What? 我还没有标出答案,你是什么意思?
public IEnumerable<FooDto> GetFooByPrimaryKeys(List<Tuple<int, string>> keys)
{
    return FooContext.Foo.ToList().Where(f => keys.Any(x => x.Item1 == f.Id && x.Item2 == f.Data));
}