C# 列表的E.F.lambda表达式<;字符串>;用StartsWith

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

我正在用.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.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) )