具有StartsWith </string>的List <string>的E.F. lambda表达式

时间:2015-03-16 08:15:12

标签: c# sql-server entity-framework lambda

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

我该怎么做?

2 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情:

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

答案 1 :(得分:0)

chinaCodes.Contains(e.CODE)

您必须区分String.Contains()IEnumerable<T>.Contains()

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

在集合上,该方法将返回集合是否包含完全相同的元素(不仅仅是其中的一部分!)。

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

这是正确的LINQ语句:

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

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

相关问题