Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用实体框架实现搜索功能?_C#_Linq_Entity Framework_Entity Framework 4_Linq To Entities - Fatal编程技术网

C# 如何使用实体框架实现搜索功能?

C# 如何使用实体框架实现搜索功能?,c#,linq,entity-framework,entity-framework-4,linq-to-entities,C#,Linq,Entity Framework,Entity Framework 4,Linq To Entities,我有一个使用实体框架建模数据库的模型。这个博客的问题是我很难找到我想要的东西。它需要一个搜索函数,但我不知道如何用SQL和/或LINQ来实现它 现在我正在用这个LINQ查询搜索我的数据库,但看起来应该更好 public IEnumerable<BlogPost> SearchBlogPosts(string query, int page, int itemsPerPage) { var result = _dataContext.BlogPosts

我有一个使用实体框架建模数据库的模型。这个博客的问题是我很难找到我想要的东西。它需要一个搜索函数,但我不知道如何用SQL和/或LINQ来实现它

现在我正在用这个LINQ查询搜索我的数据库,但看起来应该更好

    public IEnumerable<BlogPost> SearchBlogPosts(string query, int page, int itemsPerPage)
    {
        var result = _dataContext.BlogPosts
            .Where(BlogPostContains(query))
            .OrderByDescending(x => x.PostedDate)
            .Skip((page - 1) * itemsPerPage)
            .Take(itemsPerPage),
        return result;
    }

    private Func<BlogPost, bool> BlogPostContains(string query)
    {
        return x => x.Title.Contains(query) || x.Body.Contains(query) || x.Author.Contains(query);
    }
public IEnumerable SearchBlogPosts(字符串查询、int-page、int-itemsPerPage)
{
var result=\u dataContext.BlogPosts
.Where(BlogPostContains(查询))
.OrderByDescending(x=>x.PostedDate)
.Skip((第1页)*itemsPerPage)
.拿(物品专页),
返回结果;
}
私有Func BlogPostContains(字符串查询)
{
返回x=>x.Title.Contains(查询)| | x.Body.Contains(查询)| | x.Author.Contains(查询);
}
这样做的一个大问题是搜索区分大小写

问题1)是否有更好的方法使用LINQ进行实体搜索

问题2)使用纯SQL怎么样?如何在SQL Server中编写搜索存储过程,以便在EF而不是LINQ中映射和使用该存储过程

我只希望在数据库中执行不区分大小写的搜索,以保持良好的性能


提前感谢。

标准方法是SQL全文搜索。您必须在数据库上启用全文,将列指定为全文索引,然后才能使用这些列进行SQL查询


LINQtoEntities目前不支持全文搜索查询-为此,您必须求助于标准SQL查询。您至少可以使用将搜索结果映射到键入的结果。

我会在Lucene.Net上寻找一个好的搜索提供程序。

SQL Server的默认排序规则不区分大小写,这意味着类似这样的where子句(这是LINQ to Entities将从
中创建的
包含的内容)

…应该找到“约翰·韦恩”。我相信您的查询不是在服务器上执行的,而是在内存中使用LINQ to对象的情况下执行的——在那里,搜索是区分大小写的。这是对对象的LINQ,因为您没有从
BlogPostContains
返回
表达式。签名应为:

private Expression<Func<BlogPost, bool>> BlogPostContains(string query)
私有表达式BlogPostContains(字符串查询)
如果您只返回
Func
,那么您使用的是
Where
扩展方法的
IEnumerable
(而不是
IQueryable
)重载,这反过来会导致整个
BlogPosts
表首先加载到内存中。然后在内存中使用LINQ将过滤器应用于对象

如果返回一个
表达式
,您想知道大小写敏感度是否消失


(只是关于您的区分大小写问题的说明,而不是关于实现搜索功能的最佳方法的一般问题的解决方案。)

根据您使用LINQ进行的搜索,您可以尝试以下方法,效果很好:

(x.Title).ToUpper().Contains(query.ToUpper())
或者类似的ToLower()方法也应该足够了

对于真正考虑大写“A”与小写字母“A”不同的数据库,它们在技术上是不同的,上面的LINQ过程将得到结果。
希望这有帮助

听起来不错。我很高兴有一个标准的方法来做到这一点。我不介意是否必须创建一个存储过程,因为我可以将它们映射为实体框架中的方法。我会关注你的链接。谢谢。没关系,我误解了。我不知道我的Func会让它进入记忆。你是对的。表达式确实解决了区分大小写的问题。谢谢
(x.Title).ToUpper().Contains(query.ToUpper())