使用LINQ

时间:2018-03-13 08:51:35

标签: c# visual-studio linq

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

如何在多列中搜索?

3 个答案:

答案 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个参数搜索,你必须比较那些参数