【问题标题】:How to query using linq statements?如何使用 linq 语句进行查询?
【发布时间】:2012-03-26 11:30:09
【问题描述】:

我有两个对象

List<Report> 
List<Newsletter>

我需要某些属性,例如

Id
Date
Status
text

来自两个列表。有没有办法合并这些列表并使用 linq 语句查询它以将特定属性作为单独的列表返回? 请帮忙。

对象结构如下:

Report
{
    int id,
    datetime reportDate, 
    enum Status,
    string text
};

Newsletter
{
    int id, 
    datetime newsletterDate,
    string Status,
    string text
};

【问题讨论】:

  • 有没有办法加入他们?他们有共同的财产吗?
  • 最有趣的点。到目前为止,答案是肯定的;这是可能的——理论上。不知道你会怎么做,因为我什至不确定它们是否有类似的结构。
  • CreatedBy 属性对两者都是通用的
  • 我认为可能需要union,如果不需要,每个的结构是什么?

标签: c# linq


【解决方案1】:
var items = 
      reportList.Select(x =>  new { x.Id, x.Date, x.Status, x.text })
      .Concat(
        newsList.Select(x =>  new { x.Id, x.Date, x.Status, x.text }) );

更新,以平衡状态属性:

var items = 
      reportList.Select(x =>  new { x.Id, x.Date, Status = x.Status.ToString(), x.text })
      .Concat(
        newsList.Select(x =>  new { x.Id, x.Date, Status, x.text }) );

【讨论】:

  • 两个对象的状态属性有些不匹配。我需要将其转换为字符串。我怎样才能在匿名对象中做到这一点?
  • 注意:Concat 优于 Union,因为似乎没有删除重复项的要求。
  • 还有一个疑问。属性名称是否应该在选择器部分匹配?我的“ID”属性名称在两个对象中都不同。类型相同。
  • 那么你必须使用Id = x.Id 或类似的。它们必须匹配才能使 Concat/Union 工作。
  • 一个 LINQ 表达式。只是不是查询。
【解决方案2】:

假设两个列表都包含公共列并在它们之间应用连接..

你可以申请加入,然后得到如下数据

var data = form a in lista
join b in listb on
a.id equals b.id
select new {id=a.id, Date= b.Date, Status=a.Sttus, text=b.Text};

以下是两个表用户和用户客户端之间的连接图像

查看全文:Case 4 - JOINING TWO TABLE

【讨论】:

    【解决方案3】:
    var reps = reposts.Select(r => new { Id = r.Id, Date = r.Date, Status = r.Status, Text = r.Text});
    var news = newsletters.Select(n => new { Id = r.Id, Date = r.Date, Status = r.Status, Text = r.Text});
    var result = reps.Union(news);
    

    【讨论】:

      【解决方案4】:
       var query = reports.Select(x => new { x.Id, x.Date, Status = Enum.GetName(typeof(Status), x.Status), x.Text })
      .Union(news.Select(x => new { x.Id, x.Date, x.Status, x.Text }));
      

      【讨论】:

      • 这在上述情况下不起作用。它返回属性类型不匹配的错误原因。
      • 你和 Henk 的答案是一样的。我还有一个疑问。属性名称是否应该在选择器部分匹配?我的“ID”属性名称在两个对象中都不同。类型相同。
      • 是的,它们应该匹配,但这不是问题,因为您可以为匿名类型 Id=x.AnotherId 中的属性分配另一个名称
      猜你喜欢
      • 1970-01-01
      • 2017-02-25
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-26
      相关资源
      最近更新 更多