如何在两个不同的表中显示重复值和唯一值实体框架

时间:2016-12-09 18:08:18

标签: asp.net-mvc entity-framework asp.net-mvc-5

现在我会尝试正确描述我的情况: 我有两个具有相同属性的模型是这个模型:

[Table("OperatorA")]
public class OperatorA
{
    [Key]
    public string Id { get; set; }
    public string Number { get; set; }
    public string CallTime { get; set; }
    public string Duration { get; set; }
    public decimal Cost { get; set; }
}

[Table("OperatorB")]
public class OperatorB
{
    [Key]
    public string Id { get; set; }
    public string Number { get; set; }
    public string CallTime { get; set; }
    public string Duration { get; set; }
    public decimal Cost { get; set; }
}

之后我在这个表中插入数据,一切正常,但是 - 现在我需要比较这两个表: 1.检查表和视图主题中的重复Number属性。 和 2.查看所有不重复的Number值。 任何人都可以帮我控制器。

public async Task<ActionResult> Index()
    {
        var operatorA = await db.OperatorAs.ToListAsync();
        var operatorB = await db.OperatorBs.ToListAsync();

        // Want get all operatorB Numbers witch not equals OperatorA Numbers
    }

1 个答案:

答案 0 :(得分:1)

请注意,这样的查询很容易导致严重的性能问题,具体取决于列表中的记录数。使用awaitToListAsync将整个列表发送到应用程序服务器,然后在控制器中过滤结果通常不是一个好习惯。仅在您确定列表不会超过几百条记录(作为原始估算)时使用它。执行操作使用的执行时间和数据量的一些指标。

最好的解决方案是在数据库服务器中执行查询过滤,并在执行.ToList()之前应用 >,因为当您实现结果记录列表时查询在数据库中执行,任何进一步的过滤或处理都不会在数据库中完成,而是在应用程序服务器中完成。

这个在两个表之间使用join的示例查询,可以获得OperatorA中重复Number的{​​{1}}元素列表:

OperatorB

它生成这个SQL:

var query = db.OperatorAs
    .Join<OperatorA, OperatorB, string, OperatorA>(
        db.OperatorBs,
        a => a.Number,
        b => b.Number,
        (a, b) => a)
   .ToList();

如果列表非常大,即使在数据库服务器中也会导致性能问题,但数据库服务器比应用程序服务器更好地处理这些问题。有办法解决它。