C# 跳过/采用两个合并列表的策略
你有什么想法可以继续吗 背景: 这是一个有点奇怪的领域,但本质上我有一个人员表(保存主记录)和一个列表表(保存该人员的历史版本)。 一个列表总是有一个人,一个人并不总是有一个列表 功能的工作原理: 我有两个列表,它们是根据3个字段的输入组合(姓氏、名字、id号)或id号的精确匹配从我的数据库中提取的C# 跳过/采用两个合并列表的策略,c#,sql,linq,entity-framework,C#,Sql,Linq,Entity Framework,你有什么想法可以继续吗 背景: 这是一个有点奇怪的领域,但本质上我有一个人员表(保存主记录)和一个列表表(保存该人员的历史版本)。 一个列表总是有一个人,一个人并不总是有一个列表 功能的工作原理: 我有两个列表,它们是根据3个字段的输入组合(姓氏、名字、id号)或id号的精确匹配从我的数据库中提取的 var efListingPersons = (from d in myentity.Listings.Include("Person") where (( (d.ListingSu
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%有效的,并且已经持续了一段时间。
但是现在我的表中有很多数据,我想通过引入分页来提高效率。这也很简单。我可以只传递skip和take的方法值,但我有一种烦人的感觉,如果我在两个单独的查询中这样做,我会得到扭曲的结果,因为两个表es将有不同顺序的记录。结果在我看来是正确的,但我只需要一点逻辑知识
因此,本质上,我的问题是,如果我在两个单独的列表中进行两次单独的跳过/接受,我的数据是否可靠
谢谢底线是您正在显示直接或间接符合某些条件的分页
人员
s。因此,它可以是一个查询,其基本形状可以是
myentity.Persons.Where(...).OrderBy(p => p.SomeProperty).Skip(x).Take(y);
现在,在中放置什么
直接条件:
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)))
(您可以将链接到其中
或将它们与和&
组合起来)如果您希望订单保持一致,您应该orderby
一些唯一的值在一个正确的位置,你将如何进行寻呼?你将按人
寻呼吗?如果是这样,你只需在人
查询中添加跳过
/获取
。确实是按人寻呼。这样,你就可以翻页你的人
结果并修改你的人列表
查询以仅查找那些在您的efPersons
集合中有匹配项的记录,或者我误解了什么?Person
是否有Listings
属性?