- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我们目前正在集成一个为我们提供数据的外部系统。该系统包含有关客户许可证及其更新时间的信息。每个许可证或作为模型调用的 TPCase
可以有多个更新周期 TPRenewalCycle
。然后,客户可以在我们的系统中下订单,然后许可证会续订,新的续订周期开始。
但是,对于拥有大量需要续订的许可证的客户,我们遇到了一些性能问题。这是因为我们需要检查下一个更新周期是否已经订购但尚未处理,其余代码足够快(db.OrderRows.Any(...
)
客户可以在不使用该系统的情况下续订他们的许可证,因此我们不希望为 OrderRow
添加可为空的外键到 TPRenewalCycle
。
以下是我们当前的模型和代码。有没有办法加快这个过程?我能想到的是直接识别 tpCase.NextRenewalCycle
,然后检查 OrderRows
中是否不存在任何值。
如果在 Entity Framework
中很难做到,我们可能愿意直接使用 T-SQL
如果我们不必像现在这样检查它。
案例(来自外部系统的模型):
public class TPCase
{
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string BusinessSystemId { get; set; }
[Key, Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CaseId { get; set; }
public bool VisibleToClient { get; set; }
public virtual ICollection<TPCaseName> CaseNames { get; set; }
public virtual ICollection<TPRenewalCycle> RenewalCycles { get; set; }
[NotMapped]
public TPRenewalCycle NextRenewalCycle { get; set; }
}
public class TPCaseName
{
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string BusinessSystemId { get; set; }
[Key, Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CaseId { get; set; }
[Key, Column(Order = 2)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int NameNo { get; set; }
[Key, Column(Order = 3)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string NameType { get; set; }
[ForeignKey("BusinessSystemId,CaseId")]
public virtual TPCase TPCase { get; set; }
[ForeignKey("BusinessSystemId,NameNo")]
public virtual TPName TPName { get; set; }
public virtual TPNameType TPNameType { get; set; }
public string ContactName { get; set; }
}
public class TPName
{
[Key, Column(Order = 0)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string BusinessSystemId { get; set; }
[Key, Column(Order = 1)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int NameNo { get; set; }
public string Name { get; set; }
}
public class TPNameType
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string NameType { get; set; }
public string Description { get; set; }
}
public class TPRenewalCycle
{
[Key, Column(Order = 0)]
[ForeignKey("TPCase")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string BusinessSystemId { get; set; }
[Key, Column(Order = 1)]
[ForeignKey("TPCase")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CaseId { get; set; }
public virtual TPCase TPCase { get; set; }
[Key, Column(Order = 2)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string Action { get; set; }
[Key, Column(Order = 3)]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Cycle { get; set; }
public bool? IsOpen { get; set; }
public virtual ICollection<TPCaseEvent> CaseEvents { get; set; }
}
public class TPCaseEvent
{
[Key, Column(Order = 0)]
[ForeignKey("TPRenewalCycle")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string BusinessSystemId { get; set; }
[Key, Column(Order = 1)]
[ForeignKey("TPRenewalCycle")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CaseId { get; set; }
[Key, Column(Order = 2)]
[ForeignKey("TPRenewalCycle")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string Action { get; set; }
[Key, Column(Order = 3)]
[ForeignKey("TPRenewalCycle")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Cycle { get; set; }
public virtual TPRenewalCycle TPRenewalCycle { get; set; }
[Key, Column(Order = 4)]
[ForeignKey("TPEvent")]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EventNo { get; set; }
public virtual TPEvent TPEvent { get; set; }
public DateTime? DueDate { get; set; }
public DateTime? EventDate { get; set; }
}
public class TPEvent
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int EventNo { get; set; }
public string Name { get; set; }
[Column(TypeName = "nvarchar(MAX)")]
[MaxLength]
public string Description { get; set; }
}
订单(我们的模型):
public class Order
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
public virtual ICollection<OrderRow> OrderRows { get; set; }
}
public class OrderRow
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
public DateTime Created { get; set; }
public DateTime Updated { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string BusinessSystemId { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int CaseId { get; set; }
[ForeignKey("BusinessSystemId,CaseId")]
public virtual TPCase TPCase { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public string Action { get; set; }
[DatabaseGenerated(DatabaseGeneratedOption.None)]
public int Cycle { get; set; }
[ForeignKey("BusinessSystemId,CaseId,Action,Cycle")]
public virtual TPRenewalCycle TPRenewalCycle { get; set; }
public int OrderId { get; set; }
public virtual Order Order { get; set; }
}
方法:
public IEnumerable<TPCase> GetRenewalCasesForCustomer(IList<int> customerNumberKeys)
{
var db = new DbContext();
var cases = db.Cases
.Where(tpCase =>
tpCase.VisibleToClient == true &&
tpCase.CaseNames.Any(
caseName => customerNumberKeys.Contains(caseName.NameNo) &&
caseName.BusinessSystemId == "EN" &&
caseName.NameType == "T") &&
tpCase.RenewalCycles.Any(
renewalCycle =>
renewalCycle.IsOpen == true &&
renewalCycle.Action == "RW" &&
renewalCycle.CaseEvents.Any(caseEvent =>
caseEvent.EventNo == -112 &&
caseEvent.DueDate >= DateTime.Now
))
)
.Include(tpCase => tpCase.CaseNames.Select(caseName => caseName.TPName))
.Include(tpCase => tpCase.CaseNames.Select(caseName => caseName.TPNameType))
.Include(tpCase => tpCase.RenewalCycles.Select(renewalCycle => renewalCycle.CaseEvents))
.ToList();
foreach (var tpCase in cases)
{
var cycles =
tpCase.RenewalCycles.Where(
x => x.IsOpen == true &&
x.Action == "RW" &&
x.CaseEvents.FirstOrDefault(y => y.EventNo == -112)?.DueDate != null &&
x.CaseEvents.Single(y => y.EventNo == -112)?.DueDate >= DateTime.Now)
.ToList();
if (cycles.Any())
{
var cycle = cycles.OrderBy(
x => x.CaseEvents.Single(y => y.EventNo == -11)?.DueDate)
.First();
tpCase.NextRenewalCycle = cycle;
}
}
for (int i = cases.Count - 1; i >= 0; i--)
{
var tpCase = cases[i];
if (tpCase.NextRenewalCycle == null)
{
cases.RemoveAt(i);
continue;
}
//This is the time consuming part where all the requests are made
var orderExist = db.OrderRows.Any(x =>
x.BusinessSystemId == tpCase.BusinessSystemId &&
x.CaseId == tpCase.CaseId &&
x.Action == tpCase.NextRenewalCycle.Action &&
x.Cycle == tpCase.NextRenewalCycle.Cycle
);
if (orderExist)
{
cases.RemoveAt(i);
}
}
return cases;
}
最佳答案
比我最初想象的要容易,我想我必须写下问题才能看到它。
鉴于我们有一个 FK 到 TPRenewalCycle
在 OrderRow
我可以添加 public virtual ICollection<OrderRow> OrderRows { get; set; }
至 TPRenewalCycle
.
在查询中,我可以像其他表一样包含符合我给定条件的订单行。
.Include(tpCase => tpCase.RenewalCycles.Select(renewalCycle => renewalCycle.OrderRows))
现在我有了这个,我可以删除下一个续订周期有任何订单行的情况。因为我们已经有了信息,所以不需要往返数据库,而且速度非常快。
for (int i = cases.Count - 1; i >= 0; i--)
{
var tpCase = cases[i];
if (tpCase.NextRenewalCycle == null || tpCase.NextRenewalCycle.OrderRows.Any())
{
cases.RemoveAt(i);
}
}
关于c# - 从 DbSet 中的集合中获取单个值并将此值与另一个 DbSet 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49692321/
我想做的是让 JTextPane 在 JPanel 中占用尽可能多的空间。对于我使用的 UpdateInfoPanel: public class UpdateInfoPanel extends JP
我在 JPanel 中有一个 JTextArea,我想将其与 JScrollPane 一起使用。我正在使用 GridBagLayout。当我运行它时,框架似乎为 JScrollPane 腾出了空间,但
我想在 xcode 中实现以下功能。 我有一个 View Controller 。在这个 UIViewController 中,我有一个 UITabBar。它们下面是一个 UIView。将 UITab
有谁知道Firebird 2.5有没有类似于SQL中“STUFF”函数的功能? 我有一个包含父用户记录的表,另一个表包含与父相关的子用户记录。我希望能够提取用户拥有的“ROLES”的逗号分隔字符串,而
我想使用 JSON 作为 mirth channel 的输入和输出,例如详细信息保存在数据库中或创建 HL7 消息。 简而言之,输入为 JSON 解析它并输出为任何格式。 最佳答案 var objec
通常我会使用 R 并执行 merge.by,但这个文件似乎太大了,部门中的任何一台计算机都无法处理它! (任何从事遗传学工作的人的附加信息)本质上,插补似乎删除了 snp ID 的 rs 数字,我只剩
我有一个以前可能被问过的问题,但我很难找到正确的描述。我希望有人能帮助我。 在下面的代码中,我设置了varprice,我想添加javascript变量accu_id以通过rails在我的数据库中查找记
我有一个简单的 SVG 文件,在 Firefox 中可以正常查看 - 它的一些包装文本使用 foreignObject 包含一些 HTML - 文本包装在 div 中:
所以我正在为学校编写一个 Ruby 程序,如果某个值是 1 或 3,则将 bool 值更改为 true,如果是 0 或 2,则更改为 false。由于我有 Java 背景,所以我认为这段代码应该有效:
我做了什么: 我在这些账户之间创建了 VPC 对等连接 互联网网关也连接到每个 VPC 还配置了路由表(以允许来自双方的流量) 情况1: 当这两个 VPC 在同一个账户中时,我成功测试了从另一个 La
我有一个名为 contacts 的表: user_id contact_id 10294 10295 10294 10293 10293 10294 102
我正在使用 Magento 中的新模板。为避免重复代码,我想为每个产品预览使用相同的子模板。 特别是我做了这样一个展示: $products = Mage::getModel('catalog/pro
“for”是否总是检查协议(protocol)中定义的每个函数中第一个参数的类型? 编辑(改写): 当协议(protocol)方法只有一个参数时,根据该单个参数的类型(直接或任意)找到实现。当协议(p
我想从我的 PHP 代码中调用 JavaScript 函数。我通过使用以下方法实现了这一点: echo ' drawChart($id); '; 这工作正常,但我想从我的 PHP 代码中获取数据,我使
这个问题已经有答案了: Event binding on dynamically created elements? (23 个回答) 已关闭 5 年前。 我有一个动态表单,我想在其中附加一些其他 h
我正在尝试找到一种解决方案,以在 componentDidMount 中的映射项上使用 setState。 我正在使用 GraphQL连同 Gatsby返回许多 data 项目,但要求在特定的 pat
我在 ScrollView 中有一个 View 。只要用户按住该 View ,我想每 80 毫秒调用一次方法。这是我已经实现的: final Runnable vibrate = new Runnab
我用 jni 开发了一个 android 应用程序。我在 GetStringUTFChars 的 dvmDecodeIndirectRef 中得到了一个 dvmabort。我只中止了一次。 为什么会这
当我到达我的 Activity 时,我调用 FragmentPagerAdapter 来处理我的不同选项卡。在我的一个选项卡中,我想显示一个 RecyclerView,但他从未出现过,有了断点,我看到
当我按下 Activity 中的按钮时,会弹出一个 DialogFragment。在对话框 fragment 中,有一个看起来像普通 ListView 的 RecyclerView。 我想要的行为是当
我是一名优秀的程序员,十分优秀!