我正在使用.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.`
我该怎么做?
答案 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) )
编辑我最初误解了你的问题,但已经纠正了我的答案。