繁体   English   中英

我怎样才能使这个 LINQ to SQL where 子句和条件更快?

How can I make this LINQ to SQL where clause with conditions faster?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有以下 LINQ to SQL 查询,但我想知道在将它们添加到 where 子句之前是否有更快的方法来验证来自 post action 的数据? 例如:

bookFilter = Informations coming from the post action

int count = from b in _libraryContext.Book
            join ba in _libraryContext.BookAuthor
            on b.Id equals ba.BookId
            where (!string.IsNullOrWhiteSpace(bookFilter.Name) ? 
            b.Name.Contains(bookFilter.Name.ToUpper()) : 1 == 1 )
            where (!string.IsNullOrWhiteSpace(bookFilter.Decription) ? 
            b.Description.Contains(bookFilter.Description.ToUpper()) : 1 == 1)
            where (bookFilter.BookId > 0 ? ba.BookId == bookFilter.BookId : 1 == 1)

return count;
3 个回复

我从来没有经常使用这种类型的语法,所以我确定你是否可以这样做,但你当然可以用 LINQ 来做到这一点,并像这样一步一步地建立你的查询:

var query = _libraryContext.Set<Book>();

if(!string.IsNullOrWhiteSpace(bookFilter.Name))
{
    query = query.Where(x => x.Name.Contains(bookFilter.Name.ToUpper()));
}

if(!string.IsNullOrWhiteSpace(bookFilter.Description))
{
    query = query.Where(x => x.Description.Contains(bookFilter.Description.ToUpper()));
}

if(bookFilter.BookId > 0)
{
    query = query.Where(x => x.BookId == bookFilter.Id);
}

return query.Count();

注意:我在这里省略了 JOIN,因为它似乎没有必要,但是如果需要,您当然也可以使用此语法进行连接。

您已接受@Akinzekeel 上面提供的解决方案。 但是,如果您尝试使用单个 LINQ 查询,我会采用以下解决方案:

bookFilter = Informations coming from the post action

请注意这里bookFilter必须是 IQueryable!

int count = from b in _libraryContext.Book
            join ba in _libraryContext.BookAuthor
            on b.Id equals ba.BookId
            where (b.Name.Contains(bookFilter.Name.ToUpper()) || string.IsNullOrWhiteSpace(bookFilter.Name)) && 
            (b.Description.Contains(bookFilter.Description.ToUpper()) || string.IsNullOrWhiteSpace(bookFilter.Decription)) &&
            (ba.BookId == bookFilter.BookId || bookFilter.BookId == 0 )

return count;

如果您在 SQL Profiler 中跟踪上面的代码,您将看到这将生成单个 SQL 查询; 类似于(OR IS NULL)条件。

在 SQL 中,您可以使用 COALESCE 来默认忽略参数——如下所示:

SELECT *
FROM book b
JOIN BookAuthor ba on b.id = ba.Bookid
WHERE COALESCE(UPPER(name), UPPER(b.name)) = UPPER(b.name)
  AND COALESCE(UPPER(description), UPPER(b.description)) = UPPER(b.description)
  AND COALESCE(bookid, b.book.id) = b.bookid 

推荐的模式是将类似的东西放在 SP 中,然后调用 SP。

1 Linq条件Where子句

在搜索linq条件where子句时,我发现了这篇文章 ,他们使用的方式如下: 但我想知道这种方法有效吗? linq会执行多少次查询? ...

2 Linq带if条件的where子句

我有以下模型: 我正在查询文档存储库,我想获取所有文档以及未删除项目的文档。 但是,这是行不通的,因为有些文档与项目相关,而有些项目却没有。 即:该项目为null的文档应该返回,但这种情况下不返回。 正确的方法是什么? ...

2015-06-15 17:30:22 2 513   c#/ linq
3 哪个 SQL 查询更快? 筛选加入条件或 Where 子句?

比较这两个查询。 将过滤器放在连接条件或WHERE子句中是否更快。 我一直觉得它在加入标准上更快,因为它会在尽可能快的时刻减少结果集,但我不确定。 我将建立一些测试来查看,但我也想就哪些更易于阅读获得意见。 查询 1 查询 2 编辑 我运行了一些测试,结果表明它实际上非常接近,但是WHE ...

4 SQL“条件” where子句

我有一个正在通过队列填充的表,但无法更改表的结构。 问题:该表包含四个标识符-SKU,部门,类和子类-我需要从表中返回其他字段,以符合以下第一个条件的顺序: 如果表中存在SKU,则获取sku的值 否则,如果表中存在SKU的Department / Class / Subc ...

2016-03-04 04:48:53 1 126   sql
5 sql条件where子句

我的桌上有两条记录: 表: 我的查询: 我的问题是它不会返回任何结果。 如果我用or替换and ,它将返回两行。 我正在考虑使用ISNULL但对我来说没有运气。 编辑 我想要的是从给定的开始日期和结束日期返回行,无论该行的结束日期是否为空。 在上面的示 ...

2016-03-08 09:44:13 4 47   sql
7 Linq:添加 Where 子句“或”条件

我正在发送 2 个数组。 类别 ID 和品牌 ID 我将匹配 categoryIds 到 carList var 的那些传递到 View 中,但是对于查询“或”,如果客户除了类别之外还选择了一个品牌,我想传递两个查询。 如果选择了跑车类别,它应该如下所示。 Car1 - 本田,Car2 ...

8 LINQ中的条件Where子句

假设我在网格中显示数据,并且我有许多用于过滤数据的文本框。 员工编号的文本框。 如果员工ID文本框为空,则不添加where子句,但如果不为空,则为此添加where子句。 如果薪水文本框具有值或雇员姓名文本框具有值,我们可以使用相同的方法过滤数据。 我尝试撰写条件LINQ查询,但出现错 ...

2015-04-02 11:01:06 2 1555   c#/ linq
9 Linq到SQL转义WHERE子句

我有这个Linq-to-SQL查询 最终查询的结果正确,只有一个ID。 当我有大数据时,出现内存不足异常的问题。 当我检查生成的查询时 看来Linq-to-SQL从数据库中获取所有数据并将其过滤到内存中。 ...

10 LINQ条件Where子句包括多个条件

我正在尝试构建LINQ语句,该语句在where子句中说明了两个不同的条件,并且我还没有在此处找到针对我要执行的操作的解决方案。 我有一个尝试查询的流程步骤列表: 我有两个传入的变量,includeA和includeB。 我需要所有标准步骤,如果includeA为true,还需要A ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM