1

我的应用程序中有搜索功能。它的工作方式是,用户拉出一条记录,然后使用搜索按钮将记录中的名字、姓氏和出生日期传递给 LINQ 查询。LINQ 查询应该提供可能的匹配项。现在它提供了太多的结果。我希望出生日期匹配准确,然后名字和姓氏匹配可能有点松散。在一个完美的世界中,结果将是:

  1. 与 DOB 完全匹配
  2. 模糊匹配名字
  3. 接近但不严格匹配姓氏。

例如,如果我要搜索 1974 年 11 月 27 日出生的 James May,我希望得到如下结果:

吉姆 1974 年 11月 27 日
杰克 1974 年 11 月 27 日 詹姆斯 梅福德 1974 年 11 月 27 日

我知道最好的方法是存储过程,但我试过了,每次我将存储的 Proc 添加到我的项目中时,它都会损坏 EDMX 文件,所以我坚持使用 LINQ。

这是我到目前为止所拥有的:

        var query = from p in _Elig_DB.PersonAttributes.ToList()
                    where   p.getDateOfBirth == DOB &&
                                    p.FirstName.Contains(FName) || p.FirstName.StartsWith(FName) &&
                                    p.LastName.Contains(LName) || p.LastName.StartsWith(LName)

                    select p;

这给出了这样的结果:

Ileana   May         10/30/1967
Kristina May         4/23/1971
margaret Mayberry    7/26/1942
Karla    Mayorga     5/14/1986
Stan     Mayer       3/8/1952
Lori     Maynard     7/22/1965

所以姓是好的,但出生日期不应该那样变化。感谢您的阅读。

4

2 回答 2

1

只需修正括号。

    var query = from p in _Elig_DB.PersonAttributes.ToList()
                where   p.getDateOfBirth == DOB &&
                                (p.FirstName.Contains(FName) || p.FirstName.StartsWith(FName) &&
                                p.LastName.Contains(LName) || p.LastName.StartsWith(LName))

                select p;
于 2012-11-19T22:08:22.943 回答
0

抱歉,我还不能添加评论,但想补充一点,从数据库中获取数据时,您的查询没有使用 where 过滤器。

目前,以下 sql 或等效语句将在您的数据库上执行。

select * _Elig_DB.PersonAttributes

表中的所有行都将更新为实体对象。只有这样,您语句的 where 部分才会针对实体执行并忽略不需要的结果。

我假设这是无意的,您宁愿优化初始查询。

发生这种情况的原因是您的 linq 语句的 from 部分有一个 .ToList() 语句。tolist 语句强制查询立即执行并构建对象列表。

如果您将您的声明更改为(不带tolist):

var query = from p in _Elig_DB.PersonAttributes
            where   p.getDateOfBirth == DOB &&
                            (p.FirstName.Contains(FName) || p.FirstName.StartsWith(FName) &&
                            p.LastName.Contains(LName) || p.LastName.StartsWith(LName))

            select p;

此时您的查询尚未获取任何数据。(注意显式 var 查询类型是 Queryable)现在您可以执行完整的查询,只获取您需要的数据库行。

var results = query.ToList();
于 2012-11-22T10:11:44.840 回答