【问题标题】:Optional Where clause in query查询中的可选 Where 子句
【发布时间】:2012-05-05 20:24:22
【问题描述】:

我有一个应用程序搜索我们的数据库(通过 EF 公开)以查找满足某些条件的记录。我们有两个主要表(作业和收件人)。收件人通过作业 ID 链接到作业表。

作业记录具有多个字段(处理日期、名称、作业类型)。收件人有很多姓名和 ID 字段(例如帐号、姓氏等)

我想展示一个搜索屏幕,他们可以在其中看到要搜索的字段列表。然后 ASP.net 代码查看用户输入(或选择)了哪些文本框,并基于此构建查询。

我只是想找到最有效的方法。

粗略的逻辑是:

    if not string.isnullorempty(txtName.text) then
        'Query.Where.Add clause = " AND Name like '@txtName'
        'Query.WhereParameters.Add("@txtName",txtNAme.text
    end if

if not string.isnullorempty(txtAccountNumber.text) then 

.....etc


 if not string.isnullorempty(txtFromDate.text) then..

我遇到的困难是弄清楚如何添加额外的 where 子句。我应该只使用 Entity SQL 吗?

这也能返回强类型的 EF 对象吗?是否可以同时返回 Jobs 和 Recipients 对象?

例如如果我选择了收件人。, jobs. from....blah 这会正确解析并返回链接的 Recipient 和 Job 对象吗?

【问题讨论】:

    标签: .net vb.net entity-framework objectquery


    【解决方案1】:

    如果您从强类型的未过滤查询开始,您可以使用Queryable.Where 添加过滤器。

    Name = txtName.Text
    If Not String.IsNullOrEmpty(Name) Then
        Query = Query.Where(Function(j) j.Name.Contains(Name))
    End If
    

    如果您的未过滤查询正确链接了多条记录,那么当您添加过滤器时,这些链接将被保留。

    (免责声明:我通常不使用 VB.NET;可能存在愚蠢的语法错误,但您应该能够大致了解。)

    【讨论】:

    • 所以如果我继续调用 query.where 并添加新函数,它们会类似于 SQL 中的“and”吗?例如,姓名 = john 和日期 = @date。有没有办法指定它们作为或加入?
    • 1) 是的。 (请记住Query = 部分,不要只调用Query.Where 并忽略结果。)从概念上讲,Query = Query.Where(a).Where(b).Where(c) 确实(伪代码)Query = (select * from (select * from (select * from Query where a) where b) where c),但它给出的结果与Query = (select * from Query where a && b && c) 相同,并且EF 通常会这样翻译。 2)您可以为此使用UnionQuery.Where(a).Union(Query.Where(b)) 给出与 Query.Where(a || b) 相同的结果。
    猜你喜欢
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-04
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2020-12-31
    相关资源
    最近更新 更多