C# 列表的E.F.lambda表达式<;字符串>;用StartsWith
我正在用.NETFramework4.5.1和C#开发实体框架6.1.2库 我有一个谓词:C# 列表的E.F.lambda表达式<;字符串>;用StartsWith,c#,sql-server,entity-framework,lambda,C#,Sql Server,Entity Framework,Lambda,我正在用.NETFramework4.5.1和C#开发实体框架6.1.2库 我有一个谓词: Expression<Func<EXTERNAL_CODES, bool>> predicate = null; List<string> codes = GetStartEntCodes(startingCode, quantity); predicate = (e => e.USED == 0 && codes.Con
Expression<Func<EXTERNAL_CODES, bool>> predicate = null;
List<string> codes = GetStartEntCodes(startingCode, quantity);
predicate = (e =>
e.USED == 0
&& codes.Contains(e.CODE)
&& e.CHINA_CODES_HEADER_ID == batch.Id
&& e.CODE_LEVEL == codeLevel
&& (e.BATCH_ID == batch.Id || e.BATCH_ID == null));
我怎样才能做到这一点?您可以尝试以下方法:
predicate = (e =>
e.USED == 0
&& codes.Any(x => x.StartsWith(e.CODE))
&& e.CHINA_CODES_HEADER_ID == batch.Id
&& e.CODE_LEVEL == codeLevel
&& (e.BATCH_ID == batch.Id || e.BATCH_ID == null));
您必须区分String.Contains()
和IEnumerable.Contains()
对于字符串,该方法将返回字符串的某些部分是否包含给定参数。(这就是你想要的)
对于集合,该方法将返回集合是否包含完全相同的元素(而不仅仅是其中的一部分!)
您需要检查(1)您的代码是否以开头(2)列表中的任何代码
这是正确的LINQ语句:
chinaCodes.Any(x => e.CODE.StartsWith(x) )
Edit我最初误解了您的问题,但已经更正了我的答案。A。Where()
将返回匹配值列表,这将不起作用,因为这是一个布尔计算。将其更改为。使用完全相同谓词的Any()
应该可以解决此问题。根据MSDN(),不支持使用启动。
chinaCodes.Contains(e.CODE)
chinaCodes.Any(x => e.CODE.StartsWith(x) )