我的应用中有搜索功能。它的工作方式是,用户提取记录,工具包是搜索按钮,它将记录中的名字,姓氏和出生日期传递给LINQ查询。然后LINQ查询应该提供可能的匹配。现在它提供了太多的结果。我希望出生日期匹配准确,然后匹配的名字和姓氏可能有些松散。在完美的世界中,结果会有:
例如,如果我正在寻找詹姆斯·梅,出生于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
所以姓氏很好,但出生日期不应该那样变化。谢谢你的阅读。
答案 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)
目前,将在您的数据库上执行以下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();