我正在尝试使用Visual Studio中的LINQ创建搜索方法。在我的数据库中,我有三个字段“Firstname”,“LastNamePrefix”和“Lastname”。我的搜索字符串是Searchtext。如何创建一个搜索所有字段的简单LINQ查询?
我现在所拥有的是:
query = query.Where(x => x.FirstName.Contains(input.SearchText) || x.LastNamePrefix.Contains(input.SearchText) || x.LastName.Contains(input.SearchText));
有了这个我真的很接近解决方案但是当我尝试将Firstname与LastNamePrefix和Lastname结合使用时,我得不到任何结果。
例如Jan van Lauw的名字:
I search Jan. It works
I search van. It works
I search Lauw. It works
I search Jan van Lauw. No results.
我尝试使用以下函数创建一个将三列组合为全名的列:
public static string CreateFullname(string firstName, string lastNamePrefix, string lastName)
{
return $"{firstName} {lastNamePrefix} {lastName}".Replace(" ", " ").Trim();
}
如果我尝试使用此列,如下面的代码,我会收到以下错误: LINQ to Entities不支持指定的类型成员'FullName'。仅支持初始值设定项,实体成员和实体导航属性。
query = query.Where(x => x.FullName.Contains(input.SearchText));
如何在多列中搜索?
答案 0 :(得分:2)
您不能在查询中使用自定义(未映射)属性,例如query.Where(x => (x.FirstName.Trim() + " " + x.LastNamePrefix.Trim() + " " + x.LastName.Trim()).Trim().Contains(input.SearchText));
,但您可以将属性内联组合:
# Preliminaries -------------------------------------------
library(tibble)
library(magrittr)
library(ggplot2)
# Fake data
x <- 1:5 %>% as.factor()
y <- rnorm(5)
df <- data_frame(x, y)
# First an example that works -----------------------------
# Notice how the color palette is
# defined within scale_fill_manual()
this_plot_works <- ggplot(df, aes(x, y, fill = x)) +
geom_bar(stat = "identity") +
scale_fill_manual(values = c("red", "blue", "orange", "green", "purple"))
# Save plot to file
saveRDS(this_plot_works, file = "this_plot_works.rds")
# To simulate the behavior of moving to a new R file
# let's remove the ggplot object from the environment.
rm(this_plot_works)
# Now, pretending we're in a new R file, load the plot
this_plot_works_reloaded <- readRDS("this_plot_works.rds")
this_plot_works_reloaded
答案 1 :(得分:1)
当您使用calculate属性时,LINQ to实体无法构建查询。 尝试在查询中使用就地字符串连接。
我不确定LINQ to Entities是否能够将此表达式转换为SQL&#34;喜欢&#34;查询,但我在Entity Framework中使用了这种方法。
query = query
.Where(x => (x.FirstName + " " + x.LastNamePrefix + " " + x.LastName).Contains(input.SearchText));
您只需合并两个OR查询即可使搜索更加灵活:
query = query
.Where(x => (x.FirstName + " " + x.LastNamePrefix + " " + x.LastName).Contains(input.SearchText)
|| (x.FirstName + " " + x.LastName).Contains(input.SearchText));
答案 2 :(得分:0)
您建议将名称组合成全名并删除“”是错误的, 这就是为什么:
SearchText :'abc'
FirstName :'ab'
LastNamePrefix :'c'
姓氏:'无所谓'
您希望的结果是错误的,因为First Name或LastNamePrefix和LastName中没有'abc',但在您的建议中它将被接受。
你用3个参数搜索,你必须比较那些参数