【问题标题】:LINQ, select from multi tableLINQ,从多表中选择
【发布时间】:2015-08-03 13:57:28
【问题描述】:

我有两个表:QuestionsEducations,这些表之间没有任何关系。

如何从这两个表中选择最后 10 个(按日期排序)项目的组合?

【问题讨论】:

  • 你能详细说明一下吗?至少显示每个表中的列名。
  • 如果表之间没有关系,我们应该如何选择“组合”?更重要的是,这个q怎么有5个赞成票:|
  • 您可以执行join
  • @jrummell 我认为降神会是更好的选择。
  • 只执行两个查询是否存在性能问题?

标签: c# database linq


【解决方案1】:

你想要类似的东西

 var result = questions.OrderByDescending(i => i.id).Take(5).Union(education.OrderByDescending(i => i.id).Take(5));

【讨论】:

  • 如果一个表有 10 个,另一个表有 0 个,这将不起作用
  • 我确实说过“喜欢”:P 因为我选择了 ID 而不是日期
  • 不包含OrderByDescending的定义
  • LinQ 可以。如果你有表,你需要 tablename.AsEnumerable().Orderby......
  • @BugFinder 我使用了这个var result = db.questions.AsEnumerable().OrderByDescending(i => i.Id).Take(5).Union(db.education.AsEnumerable().OrderByDescending(i => i.Id).Take(5)); ,但我有一个错误:'System.Collections.Generic.IEnumerable<MyPrj.questions>' does not contain a definition for 'Union' and the best extension method overload 'System.Linq.ParallelEnumerable.Union<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)' has some invalid arguments
【解决方案2】:

答案取决于您是否需要生成的列表是多态的(共享公共接口的对象列表,公开要操作的公共属性)还是您不容易知道如何操作的简单对象列表演员表。

如果您要使用两者的公共字段,请创建这些公共属性的接口并让两个类都实现该接口。例如,接口可以是

Interface iBrainStuff
{
    public DateTime DateCreated;
    public int AreaOfExpertise;
    public string Description;

}

然后你只需在每个类中实现接口:

public class question: iBrainStuff


public class education: iBrainStuff

然后你创建你的结果列表

List<iBrainStuff> results = new List<iBrainStuff>();

那么你

results.AddRange(context.educations.OrderByDescending(x => x.DateCreated).Take(5);

results.AddRange(context.questions.OrderByDescending(x => x.DateCreated).Take(5);

这会将前十名(每个 5 个)放入结果列表中。并且结果列表中的结果都可以查询到它们的 iBrainStuff 接口字段:

Interface iBrainStuff
{
    public DateTime DateCreated;
    public int AreaOfExpertise;
    public string Description;

}

【讨论】:

    【解决方案3】:

    在 LINQ 中,您不能将两个具有 o 关系的表连接起来,这是执行查询所必需的。您最好执行两个 LINQ to SQL 查询以将每个表的最后 10 个选择为相似的结构,然后取这两个枚举,做一个联合并取最后 10 个。

    如果你使用了这样的结构:

    public struct QuestionsEducationsJoin
    {
        public DateTime date;
        public int QuestionID;
        public string Question;//...;
        public int EducationID;
        public string Education;//...;
    }
    

    然后您可以从两个表中选择到这个结构中:

    var questionEnumeration = database.Questions
       .OrderByDescending(question => question.DateField)
       .Take(10)
       .Select(question => new QuestionsEducationsJoin()
           {
               date = question.DateField;
               //...
           });
    
    var educationEnumeration; //...
    
    var outputEnumeration = questionEnumberation
        .Union(educationEnumeration)
        .OrderByDescending(x => x.date)
        .Take(10);
    

    【讨论】:

      猜你喜欢
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 2012-06-21
      • 2019-01-27
      相关资源
      最近更新 更多