E.F。带有 StartsWith 的 List<string> 的 lambda 表达式

E.F. lambda expression for a List<string> with StartsWith

我正在使用 .NET Framework 4.5.1 和 C# 开发 Entity Framework 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));

但这部分&& chinaCodes.Contains(e.CODE)不起作用。

e.CODE 是 nvarchar(20) 并且 codes 列表中的每个字符串仅包含前 15 个字符。

我想这样做:

`WHERE CODE LIKE `codes.value%'; -- Note: `codes.value%' represents each value in codes list.`

我该怎么做?

您可以尝试类似的方法:

        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));
chinaCodes.Contains(e.CODE)

你要区分String.Contains()IEnumerable<T>.Contains()

在字符串上,该方法将return是否字符串的某些部分是否包含您给定的参数。 (这就是你想要的)

在一个集合上,该方法将return集合是否包含一个完全相似的元素(不仅仅是它的一部分!)。

您需要检查 (1) 您的代码是否以 (2) 列表中的任何代码开头.

这是正确的 LINQ 语句:

chinaCodes.Any(x => e.CODE.StartsWith(x) )

编辑我最初误解了你的问题,但已经更正了我的答案。