Entity Framework 4.1 Linq Contains and StartsWith

12

我正在使用Entity Framework Code First。我希望针对List对象从数据库中查询实体。用contains方法可以正常工作,但是如何将其与StartsWith结合起来?

这是我的代码:

List<string> values = new List<string>();
values.Add("A");
values.Add("B");
context.Customer.Where(c => values.Contains(c.Name)).ToList();

如何查询所有以A或B开头的客户?

3个回答

15

这应该在内存中工作,但我不确定它是否可以被 EF 转换为 SQL:

context.Customer.Where(c => values.Any(s => c.Name.StartsWith(s))).ToList();

3
更新:遗憾的是,使用 EF Core 这个查询会在本地进行评估。警告:Microsoft.EntityFrameworkCore.Query[20500] 该 LINQ 表达式 'where {from String text in __texts_0 where [d].Entry.StartsWith([text]) select [text] => Any()}' 无法被转换,将在本地评估。 - Anthony Johnston
@AnthonyJohnston 这可能与此相关 - Sergey Kalinichenko

1

你不需要将它与StartsWith结合使用,因为如果它以A或B开头,那么它显然包含A或B。它不能以A或B开头而不包含A或B。

所以只需使用StartsWith而不是Contains。

context.Customer.Where(c => c.StartsWith("A") || c.StartsWith("B")).ToList(); 

我没有使用String.Contains(),而是用List.Contains()。你的解决方案可以工作,但不够动态。例如,查询A-K。 - LuckyStrike
1
@LuckyStrike - 如果你有这样的要求,我建议你在问题中包含它们。否则,你只会浪费大家的时间,因为他们无法知道你不想要的解决方案被拒绝了。 - Erik Funkenbusch

0

您可以尝试以这种方式组合这两个函数:

IQueryable<Customer> result = (from C in context.Customerwhere C.Name.StartsWith("B") && values.Contains(C.Name));

你在 context.Customerwhere 中缺少一个空格,应该是 context.Customer where 中的 from C。 - user2985029

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接