使用两个合并列表跳过/采取策略

时间:2013-12-30 14:09:08

标签: c# sql linq entity-framework

任何想法如何继续这一点。

背景:

这是一个奇怪的域名,但基本上我有一个人员表(其中包含主记录)和一个列表,其中包含该人的历史版本。 列表始终具有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%有效并且有一段时间了。 但是现在我在表格中获得了大量数据,我想通过引入分页来提高效率。这也很容易。我可以直接进入跳过和获取的方法值,但我有这种唠叨的感觉,如果我在两个单独的查询上执行此操作,我将得到扭曲的结果,因为这两个表将具有不同顺序的记录。结果看起来对我来说是正确的,但我只需要一点逻辑。

所以从本质上讲,我的问题是,如果我对两个单独的列表进行两次单独的跳过/拍摄,我的数据是否可以依赖

由于

1 个答案:

答案 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或将它们与&&组合)