【问题标题】:Linq Query join a table to a List<string> object to find any Strings not in tableLinq Query 将表连接到 List<string> 对象以查找不在表中的任何字符串
【发布时间】:2019-11-10 11:21:52
【问题描述】:

我有一个接收对象列表的 webAPI。目前,这些数据作为数据表对象传递给存储过程,但由于 dataDump 可以保存 1000 条 ResponseAPI 记录,这证明有点慢。

所以,我开始研究使用 EF 来承担负载的概念,使用上下文中的 SaveChanges 一次性推送所有更改。

var dataDump = new List<ResponseAPI>
{
    new ResponseAPI
    {
        Id= "1000",
        Code = "C15",
        value = "1976"
    },
    new ResponseAPI
    {
        Id = "999",
        Code = "C14",
        value = "1976"
    }
};
var step2 = from l in dataDump
            join p in Plants on new { X1 = l.Code } equals new { X1 = p.Code }
            join ps in PlantTypes on new { X1 = l.Code, X2 = p.Id } equals new { X1 = ps.Code, X2= ps.Id}
            where ps.TypeName == "Daisy"
            select new {
                Code = l.Code,
                Id = p.Id
            };

据我所知,这段代码正在运行,没有产生任何错误。我试图从 dataDump 中获取当前在 Plants 表中不存在的 Id 列表。

我使用另一种技术取得了一些成功,但只有一个表连接。

 var step1 = dataDump.Where(s => 
                            s.Code.Any(
                            a => !context.Plants
                            .Select(x => x.Code)
                                       .Contains(s.Code)))
                                       .Select(s => s.Code)
                                       .Distinct()
                                       .ToList();

第一个 sn-p "step2" 只是在表之间进行基本连接,它有效,但我不知道如何实现 not!在连接上。

第二个sn -p "step1" 有一个not!在上下文中,它只返回 dataDump 中不在 Plants 表中的值。

我的首选方法是第 1 步,但我不知道如何添加链接两个字段的第二个连接。

【问题讨论】:

  • 既然您没有从“PlantTypes”表中选择任何值,那么这个连接有什么用呢?也许是为了未来的发展?因为如图所示,我会说只是不要加入第二张桌子......它没有被使用!
  • 为什么需要PlantTypes 上的join? (PS 在Plants 加入时尝试into pj where !pj.Any())。 (step1 中的 PPS,s.Code 是一个集合吗?)

标签: c# entity-framework linq linq-to-entities


【解决方案1】:
var step1 = dataDump.Where(s => 

        s.Code.Any(a => !context.Plants.Select(x => x.Code).Contains(s.Code))

        &&

        s.Code.Any(a => !context.Plants.any(x => x.PlantTypes.Select(t => t.Code).Contains(s.Code)))

                        ).Select(s => s.Code).Distinct().ToList();

这可能需要一些修复,但我想知道它是否真的是您的实体之间的一对多关系。

【讨论】:

  • 首先我有一个 SQL Server 存储过程,它有一个数据表作为唯一的参数。所以我正在努力提高性能。在这个过程中,我有一个更新,它从这个输入数据表中获取数据并将其连接到两个不同的表中。这就是我要复制的内容。是的,你是对的,我没有选择一个值,所以我相应地更改了上面的代码
猜你喜欢
  • 2016-02-23
  • 2010-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
相关资源
最近更新 更多