【发布时间】:2021-08-13 00:11:01
【问题描述】:
为了简化我的问题,假设我有以下数据库模型:
// database model, the list of not supported postcodes
var postcodeExclusionArray = new List<PostcodeExclusion>() {
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "A11"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "A12"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "A12 4FR"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "AR"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "B11"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "B12"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "C11"
},
new PostcodeExclusion(){
CustomerId = 2,
Postocde = "C12"
},
// many more records...
};
它描述了不受支持的英国邮政编码。它只是一个数据源的概念,因为我们通常使用 EF Core 3.1。请记住,每条记录的格式在收集整个区域时可能会有所不同,例如EH 或仅特定属性,例如AB25HZ.
现在我想检查我的系统是否支持提供的英国邮政编码。
我的想法是只使用Where 语句在查询中执行此操作,但我不确定这是否可能。
该算法的想法是通过以下方式获取提供的邮政编码的组合
providedpostCode = "A41666";
组合:
A
A4
A41
A416
A4166
A41666
然后构建db查询如
bool isSupported = postcodeExclusionArray.Where(x => x.CustomerId == 2)
.Where(x=> x.Postocde == "A" ||
x.Postocde == "A" ||
x.Postocde == "A4" ||
x.Postocde == "A41" ||
x.Postocde == "A416" ||
x.Postocde == "A41666").First() == null;
有没有办法使用 LINQ(不是原始 SQL)来实现这一点,如果没有,最佳解决方案是什么?
我尝试使用foreach 循环,但没有找到任何解决方案。
如果不可能,那么最简单的解决方案可能是生成原始 SQL 查询,
但是,这种方法的缺点是无法进行单元测试,并且只能通过集成测试进行测试。
另一种选择是仅通过 customerId 从数据库中查询所有邮政编码并进行简单的迭代。
有任何想法吗?
干杯
【问题讨论】:
-
在内存中构建所有组合的
List<string>,然后执行.Where(x => x.CustomerId == 2 && myList.Contains(x.Postocde).FirstOrDefault() -
排除数组是否列出了在开始预期邮政编码或处于预期邮政编码的任何位置时不可接受的字符串?
-
@Loring 第一个选项这样:排除数组列出了在开始预期邮政编码时不可接受的字符串
标签: c# linq .net-core ef-core-3.1