【问题标题】:LINQ query to retrieve from one table and then anotherLINQ 查询从一个表中检索,然后从另一个表中检索
【发布时间】:2013-01-08 05:10:55
【问题描述】:

我有 2 个包含相同字段的表, 例如id,name,invoiceNo..等

我想使用 c# ling 从两个表中获取所有数据

我有以下 1 个表的示例,如何添加第二个表?

 return query = from tb1 in dataContext.tbl1
                    select new customer
                    {
                       name= tbl1.name
                    };

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    一旦你有两个相同类型的序列,你就可以使用Concat

    return dataContext.tbl1.Select(tb1 => new customer()
    {
        name = tb1.name,
    })
    .Concat(dataContext.tbl2
        .Select(tb2 => new customer()
        {
             name = tb2.name,
        }));
    

    您可以对select 调用使用查询语法,但我发现在这种特殊情况下方法语法更可取。

    【讨论】:

    • 嗨Servy,我试过你的代码,你使用的是“新”匿名类型,我如何将值分配给我已经拥有的类,“客户”类?所以两个表中的数据都存储在一个类中?因为稍后该函数需要返回 IEnumerable 对象,谢谢
    • @Ben 您的操作方式与您在 OP 中的操作方式相同。我只是在写它们时忘记添加它。
    • 我收到此错误,无法使用集合初始化程序初始化类型“客户”,因为它没有实现“System.Collections.IEnumerable”,这与我的类对象有关吗?
    • @Ben 抱歉,添加了括号。
    【解决方案2】:

    您可以使用UnionConcat

    query1 = from tb1 in dataContext.tbl1
                    select new customer
                    {
                       name= tbl1.name
                    };
    
    query2 = from tb2 in dataContext.tbl2
                        select new customer
                        {
                           name= tbl1.name
                        };
    
    var resQuery = query1.Union(query2);
    

    这与Concat 类似。 UnionConcat 之间的主要区别在于 Union 从结果中删除了重复。

    【讨论】:

    • 为什么要添加ToList?它不在OP的代码中。它似乎是一种将被称为各种上下文的方法,其中将进一步添加查询,将其全部放入内存将是一个主要问题。
    • 这只是一个例子——我可以立即尝试这部分查询按预期工作,然后我可以删除它。但我同意不需要ToList()
    • 这不仅是不需要它,而且它是非常有害的,除非注意到并删除它,否则可能会导致重大问题。如果您是第一次测试该方法并希望在列表中评估结果,那么您将在测试时在 caller 端添加一个ToList,而不是在它所在的方法中需要删除。
    • @Ben 如果您打算调用任何其他 IQueryable 方法,例如 Where、任何排序或任何其他应该在数据库上执行的操作,那么它不会是发生在数据库上,您会将对象拉入内存并使用 linq 到对象。
    • 如果你不明智地使用它是有害的。例如,如果您像dataContext.tbl1.ToList() 这样查询您的数据库,它将从内存中的tbl1 检索所有记录,如果有很多记录,那就是问题。因此,最好根据您的业务需要放置一些条件,以便根据条件减少结果集并在您实际需要检索数据的最后一点上点击ToList()
    猜你喜欢
    • 2018-05-26
    • 1970-01-01
    • 2019-06-11
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    相关资源
    最近更新 更多