gpt4 book ai didi

c# - 使用 SQL Server、EF6 保存静态列表的最佳方法

转载 作者:行者123 更新时间:2023-11-30 22:02:08 25 4
gpt4 key购买 nike

我正在开始重写现有应用程序。当前的性能瓶颈之一是将用户生成的员工列表保存到静态列表中,以便他们以后可以回来查看相同的员工列表。

下面是我正在寻找的功能的一个简单示例。生成的列表将由比示例中更复杂的查询生成。

场景: 用户搜索所有上夜类的员工,并希望保存此列表以便稍后加载。他们希望列表始终返回他们第一次运行搜索时的结果。 IE。如果新员工被添加到夜类,他们不应该在他们拉起时出现在名单上。


我尝试过的:

目前,将所有 ID 作为字符串数组存储在结果列表中,然后使用这些 ID 重建查询的解决方案非常糟糕。这是非常低效的,并且会导致参数过多的大列表出现问题。

我也试过从保存的 ID 数组构建一个表然后加入,但是,这在大型列表(20,000 多名员工)上非常慢并且经常导致超时。

我目前的想法是为每个列表创建一个新表,然后对该表和 Employee 表调用 JOIN。但是,如果 100 个用户每人保存 10 个大列表(20,000 多名员工),它很快就会成为存储和表管理的噩梦。

我认为这是一个相当普遍的解决方案问题。但是,我还没有找到关于如何存储静态列表的任何类型的示例或最佳实践(我可能正在搜索错误的东西)。是否有人对如何最好地处理此类用例场景有任何一般概念?

更新:我想我以前尝试过以下设置,但由于某种原因它没有用,这是几年前的事了;但回过头来看,这似乎最有意义。我认为我遇到的问题是 NHibernate 在 Linq 中有子选择问题。但是,这不再是限制。

我在想我有一个 StaticSavedLists 表和链接 Person(上一个示例中的 Employee)的索引表,在多对多映射中将 List 链接到 Employee。C# 中的类如下所示:

public class StaticSavedList : BaseModel
{
public string Name { get; set; }
public IList<StaticSavedListPersonIdx> PersonsIdx { get; set; } //Has many persons
}

public class StaticSavedListPersonIdx : BaseModel
{
public StaticSavedList StaticSavedList { get; set; }
public Person Person { get; set; }
}

最佳答案

您可能需要一个包含搜索“标题”详细信息的表格,其中将包含搜索的 ID,然后是包含每个搜索条目的第二个表格。然后您只需要以某种方式获取 ID(可能通过用户 ID 和轮类日期)并使用它来加入结果和员工表。

这是一个模式的样子

ShiftSearches

SearchID    int (PK)
ShiftDate datetime

搜索结果

SearchID    int (PK)
EmployeeID int (PK)

员工

EmployeeID  int (PK)
FirstName varchar
etc ...

可能的 LINQ 查询

DateTime shiftDate = new DateTime(2014,11,26);
int searchId = db.ShiftSearches.Single(s => s.ShiftDate == shiftDate).SearchID;

var results = from r in db.SearchResults where r.SearchID == searchId
join e in Employees on r.EmployeeID equals e.EmployeeID
select e;

这样您只需要一张表,而且它非常薄,因此不会占用太多空间 - 因为您只是存储所需的搜索和员工 ID,所以无论如何都无法真正缩小数据。

您发布的类结构非常符合这个概念。

关于c# - 使用 SQL Server、EF6 保存静态列表的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27158964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com