C# EF Core 5包含多个列

C# EF Core 5包含多个列,c#,entity-framework-core,C#,Entity Framework Core,我有两个模型看起来像这样: public class Filter { public string Key {get;set;} public Guid ProgramId {get;set;} } public class MyEntity { public string Name {get;set;} public string Key {get;set;} public Guid ProgramId {get;set;} } // Initiat

我有两个模型看起来像这样:

public class Filter
{
    public string Key {get;set;}
    public Guid ProgramId {get;set;}
}

public class MyEntity
{
    public string Name {get;set;}
    public string Key {get;set;}
    public Guid ProgramId {get;set;}
}
// Initiation of filters is obviously different, but it could look something like this
var filters = new []
{
    new Filter { Key = "1", ProgramId = Guid.NewGuid() },
    new Filter { Key = "2", ProgramId = Guid.NewGuid() }
}
我想获取所有
MyEntity
,其中
Key
ProgramId
至少在列表中表示一次。
Key
ProgramId
的组合是至关重要的,因为
Key
ProgramId
可以存在于不同的
Filter
组合中。因此,
程序ID
必须匹配

我的代码如下所示:

public class Filter
{
    public string Key {get;set;}
    public Guid ProgramId {get;set;}
}

public class MyEntity
{
    public string Name {get;set;}
    public string Key {get;set;}
    public Guid ProgramId {get;set;}
}
// Initiation of filters is obviously different, but it could look something like this
var filters = new []
{
    new Filter { Key = "1", ProgramId = Guid.NewGuid() },
    new Filter { Key = "2", ProgramId = Guid.NewGuid() }
}
我试过以下方法。所有示例都给出了我想要的结果,如果它们在内存中进行计算,但没有一个可以作为SQL执行/转换

备选案文1。基于:

备选案文2:

var filterPrograms = filters.Select(x => new { Key = x.Key, ProgramId = x.ProgramId }).ToArray();  
var query = myContext.MyTable.Where(x => filterPrograms.Contains( new { Key = x.Key, ProgramId = x.ProgramId} ));
// It cannot be translated.
备选案文3:

var query = myContext.MyTable.Where(x => filters.Any(y => y.Key == x.Key && y.ProgramId == x.ProgramId));
// It cannot be translated.
我使用分页,需要在SQL中对此进行评估,以便分页正常工作。我正在使用EF Core 5.0.6运行.NET5。有什么想法吗?

使用我的答案作为扩展方法
过滤器bytems
。然后您可以执行以下操作:

var filters=new[]
{
新筛选器{Key=“1”,ProgramId=Guid.NewGuid()},
新筛选器{Key=“2”,ProgramId=Guid.NewGuid()}
};
var result=myContext.MyTable
.FilterByItems(过滤器,(x,f)=>x.Key==f.Key&&x.ProgramId==f.ProgramId,true);

我最近使用了一个自定义表达式来实现这一点,它基本上为我要检查的每个项目(在您的例子中是
过滤器)生成了一个巨大的
(y.Key==x.Key&&y.ProgramId==x.ProgramId)或(y.Key==x.Key&&y.ProgramId==x.ProgramId)
语句。我现在没有时间写一个正确的答案,但这至少可以给你一个想法。最正确的答案看起来像Alt 1。你累了吗
var result=myContext.MyTable.Where(x=>concatFilters.Contains(x.Key+“\u”+x.ProgramId.ToString())
var result=myContext.MyTable.Where(x=>concatFilters.Contains((x.Key+“\u”+x.ProgramId.ToString()))还可以尝试类似于
concatFilters.Contains(x.Key+“”+(string)x.ProgramId)的方法
concatFilters.Contains(x.Key+“”+SqlFunctions.StringConvert(x.ProgramId))其中一个应该是答案。。。让我知道哪一个,我将张贴作为答案。工程伟大。它甚至会呈现一些类似下降的SQL。谢谢