繁体   English   中英

EF Core 5 包含多列

[英]EF Core 5 Contains with several columns

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

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;}
}

我想获取至少一次在列表中表示KeyProgramId的所有MyEntity KeyProgramId的组合是至关重要的,因为KeyProgramId都可以存在于不同联盟的不同Filter中。 因此KeyProgramId都必须匹配。

我的代码看起来像这样:

// 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 执行/翻译。

Alt 1. 基于这个问题

var concatFilters = filters.Select(x => x.Key + "_" + x.ProgramId).ToArray();
var result = myContext.MyTable.Where(x => concatFilters.Contains(x.Key + "_" +  x.ProgramId));
// It gives: Arithmetic overflow error converting expression to data type nvarchar.

备选案文 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 运行 .NET 5。 有任何想法吗?

将此我的答案用于扩展方法FilterByItems 然后您可以执行以下操作:

var filters = new []
{
    new Filter { Key = "1", ProgramId = Guid.NewGuid() },
    new Filter { Key = "2", ProgramId = Guid.NewGuid() }
};

var result = myContext.MyTable
    .FilterByItems(filters, (x, f) => x.Key == f.Key && x.ProgramId == f.ProgramId, true);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM