任何想法如何继续这一点。
背景:
这是一个奇怪的域名,但基本上我有一个人员表(其中包含主记录)和一个列表,其中包含该人的历史版本。 列表始终具有Person,Person并不总是具有列表
功能如何运作:
根据3个字段的组合输入(姓氏,名字,idnumber)或id号码的完全匹配,我有2个从我的数据库中提取的列表
var efListingPersons = (from d in myentity.Listings.Include("Person")
where ((
(d.ListingSurname == (inputPerson.Surname ?? d.ListingSurname))
&& (d.ListingFirstName == (inputPerson.Firstname ?? d.ListingFirstName))
&& (d.ListingIdNumber == (inputPerson.IdNumber ?? d.ListingIdNumber))
)
||
(d.ListingIdNumber == (inputPerson.IdNumber)))
select d.Person).Distinct();
var efPersons = (from d in myentity.Persons
where ((
(d.Surname == (inputPerson.Surname ?? d.Surname))
&& (d.FirstName == (inputPerson.Firstname ?? d.FirstName))
&& (d.IdNumber == (inputPerson.IdNumber ?? d.IdNumber))
)
||
(d.IdNumber == (inputPerson.IdNumber)))
select d);
然后我想合并两个列表,并删除重复项(我已经正确地删除了EqualityComparer,这很好用
return (efListingPersons.Union(efPersons).Select(o => new Person()
{
ID = o.Id,
Firstname = o.FirstName,
Surname = o.Surname
}).ToList());
所以这一切都100%有效并且有一段时间了。 但是现在我在表格中获得了大量数据,我想通过引入分页来提高效率。这也很容易。我可以直接进入跳过和获取的方法值,但我有这种唠叨的感觉,如果我在两个单独的查询上执行此操作,我将得到扭曲的结果,因为这两个表将具有不同顺序的记录。结果看起来对我来说是正确的,但我只需要一点逻辑。
所以从本质上讲,我的问题是,如果我对两个单独的列表进行两次单独的跳过/拍摄,我的数据是否可以依赖
由于
答案 0 :(得分:0)
最重要的是,您显示的是直接或间接符合某些条件的分页Person
。所以它可以是一个查询,其基本形状可以是
myentity.Persons.Where(...).OrderBy(p => p.SomeProperty).Skip(x).Take(y);
现在要放入Where
?
直接条件:
Where(p => p.ListingSurname == (inputPerson.Surname ?? p.ListingSurname)
&& p.ListingFirstName == (inputPerson.Firstname ?? p.ListingFirstName)
&& p.ListingIdNumbe == (inputPerson.IdNumber ?? p.ListingIdNumber))
间接条件,如果Person
具有属性Listings
:
Where(p => p.Listings.Any(l =>
l.ListingSurname == (inputPerson.Surname ?? l.ListingSurname)
&& l.ListingFirstName == (inputPerson.Firstname ?? l.ListingFirstName)
&& l.ListingIdNumbe == (inputPerson.IdNumber ?? l.ListingIdNumber)))
否则
Where(p => myentity.Listings.Any(l =>
l.Person == p
&& l.ListingSurname == (inputPerson.Surname ?? l.ListingSurname)
&& l.ListingFirstName == (inputPerson.Firstname ?? l.ListingFirstName)
&& l.ListingIdNumbe == (inputPerson.IdNumber ?? l.ListingIdNumber)))
(您可以链接Where
或将它们与&&
组合)