为搜索功能创建LINQ查询

时间:2012-11-19 22:00:25

标签: sql-server linq-to-entities

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

  1. 与DOB完全匹配
  2. 模糊匹配名字
  3. 关闭,但不严格,与姓氏匹配。
  4. 例如,如果我正在寻找詹姆斯·梅,出生于1974年11月27日,我希望得到如下结果:

    Jim May May 11/27/1974
    杰克于1974年11月27日 James Mayford 11/27/1974

    我知道最好的东西是存储过程,但我尝试过,每次我将存储的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
    

    所以姓氏很好,但出生日期不应该那样变化。谢谢你的阅读。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

抱歉,我还无法添加评论,但是想补充说,从数据库获取数据时,您的查询没有使用where过滤器。

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

select * _Elig_DB.PersonAttributes

表中的所有行都将被新建到实体对象中。只有这样,你的声明的哪一部分才会对实体执行,并忽略不需要的结果。

我认为这是无意的,你宁愿优化初始查询。

之所以发生这种情况,是因为你有一个     .ToList() 来自你的linq声明部分的陈述。 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();