Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 跳过/采用两个合并列表的策略_C#_Sql_Linq_Entity Framework - Fatal编程技术网

C# 跳过/采用两个合并列表的策略

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

你有什么想法可以继续吗

背景:

这是一个有点奇怪的领域,但本质上我有一个人员表(保存主记录)和一个列表表(保存该人员的历史版本)。 一个列表总是有一个人,一个人并不总是有一个列表

功能的工作原理:

我有两个列表,它们是根据3个字段的输入组合(姓氏、名字、id号)或id号的精确匹配从我的数据库中提取的

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
属性?