【问题标题】:How can I search into database with WPF and Linq-to-entities model如何使用 WPF 和 Linq-to-entities 模型搜索数据库
【发布时间】:2009-12-04 02:10:52
【问题描述】:

我准备了一个 WPF 项目,我想在其中实现更复杂的搜索。我通过 ADO.NET 实体模型使用 LINQ 到实体,并计划在 WPFToolkit DataGrid 中进行显示。

我的搜索窗口应该允许按几个不同的条件进行搜索。我的想法是能够在应用程序中写入(例如)姓名、姓氏和职业文本框,并接收所选表中与所有 3 个搜索参数相对应的所有人的列表。我希望能够在输入所有内容或仅输入一个内容时进行搜索。

我想另一种选择是将表单绑定到数据库...不过,我不知道如何像这样搜索(我知道如何显示信息、编辑和插入...但不搜索) .

我虽然将字符串应用于查询机制,但徒劳无功。似乎它不起作用。请分享一些我该怎么做的想法。任何源代码或代码片段将不胜感激。

谢谢!

【问题讨论】:

    标签: c# wpf linq linq-to-entities wpftoolkit


    【解决方案1】:

    Linq 使编写查询变得非常容易,因此您可以从更简单的构建块构建它们。对于这样的系统,您还可以进入多种级别。您可以拥有一个查询的一般形式是静态的系统,这是您的标准 Linq 查询,但您可以一直使用自定义查询描述格式,然后将其转换为 Linq 语句。

    在您的情况下,您似乎只有几个可能的过滤器。你可以这样做:

    var Query = Context.MyDataSet; //Whatever is the standard base query
    
    if (!string.IsNullOrEmpty(NameFilter))
        Query = Query.Where(e => e.Name.Contains(NameFilter));
    
    if (!string.IsNullOrEmpty(SurnameFilter))
        Query = Query.Where(e => e.Surname.Contains(SurnameFilter));
    
    ...
    
    var Result = Query.ToList(); 
    

    只要您有一组固定的用户可以搜索的参数,您就可以通过可选地添加过滤器来使用这种构建查询的方法。

    【讨论】:

    • 好的,这就是精神。基于此,当我了解变量时,我得到了解决方案。这允许我使用实体......上面的答案是可以的,但是在沟渠中使用实体。谢谢克里斯!:) 编辑:我在上面的问题中添加了我的解决方案......如果将来有人需要)
    • 奇怪...这会返回:Canott 将类型 'System.Linq.IQueryable' 隐式转换为 'System.Data.Objects.ObjectQuery 。存在显式转换(您是否缺少演员表?)
    • 忘了提到在 NameFilter 字段中我使用搜索文本框中的文本。
    • 啊,对。只需将第一个“var”替换为 IQueryable
    • 太棒了...现在更好了:) 10x!
    【解决方案2】:

    好的,这是我得到的最终解决方案,它可以工作。

    var sQuery = from x in dataContext.Patients
                 select x;
    if (!string.IsNullOrEmpty(serName.Text))
        sQuery = sQuery.Where(x => x.Name.Contains(serName.Text));
    
    if (!string.IsNullOrEmpty(serSurame.Text))
        sQuery = sQuery.Where(x => x.Surname.Contains(serSurame.Text));
    

    非常感谢您的帮助!

    【讨论】:

      【解决方案3】:

      您可以在数据库中创建一个搜索表,该表将由正常实体对象上的触发器填充。搜索表可以是:EntityTableName、EntityTableID、EntityDescriptionString。实体描述字符串将是您通过组合相关的可搜索字段插入实体时生成的内容。然后你可以在 SQL 中使用标准的 LIKE 查询,或者在 Linq2SQL 中使用 .Contains。

      搜索很难!

      【讨论】:

        【解决方案4】:

        您可以在 SQL 中编写一个存储过程来为您执行此操作,然后将其添加到您的 LINQ 实体中。

        存储过程将接受您的 3 个参数,然后执行查询。

        要处理值可能为空字符串(用户未键入任何内容)的情况,您可以添加 or 子句将其过滤掉。

        SELECT Name, Surname, Occupation FROM tblWhatever
        WHERE (@Name = '' OR @Name = Name)
        AND (@Surname = '' OR @Surname = Surname)
        AND (@Occupation = '' OR @Occupation = Occupation)
        

        我有一段时间没有写 SQL,所以可能不会马上运行。不过希望你能明白。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多