【问题标题】:E.F. lambda expression for a List<string> with StartsWith带有 StartsWith 的 List<string> 的 E.F. lambda 表达式
【发布时间】:2015-03-16 08:15:12
【问题描述】:

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

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

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

我想这样做:

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

我该怎么做?

【问题讨论】:

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


    【解决方案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));
    

    【讨论】:

    • A .Where() 将返回匹配值的列表,因为这是一个布尔评估,所以这不起作用。使用完全相同的谓词将其更改为 .Any() 应该可以解决这个问题。
    • 根据 MSDN (msdn.microsoft.com/en-us/library/vstudio/…) StartsWith 不支持。
    【解决方案2】:
    chinaCodes.Contains(e.CODE)
    

    你必须区分String.Contains()IEnumerable&lt;T&gt;.Contains()

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

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

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

    这是正确的 LINQ 语句:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-08
      • 2013-07-02
      • 1970-01-01
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多