【问题标题】:Get linq to return IEnumerable<DataRow> result获取 linq 以返回 IEnumerable<DataRow> 结果
【发布时间】:2010-12-21 20:20:00
【问题描述】:

如何在 C# 中将以下 SQL 查询转换为 LINQ?

我不需要两个表中的所有列,结果集应该是

IEnumerable<DataRow>

查询:

select 
    c.level, cl.name, c.quantity
from 
    dbo.vw_categories c
left join 
    dbo.vw_categoriesLocalization cl on c.level = cl.level 
                                     and cl.language = 'en'
where 
    c.level like '000%' 
    and c.level <> '000';

预期:

IEnumerable<DataRow> result = ????

提前谢谢..

【问题讨论】:

  • 您使用的是 LINQ to DataSet 还是 LINQ2SQL?
  • 嗨一月,我正在尝试 linq2sql..

标签: c# asp.net linq linq-to-sql c#-4.0


【解决方案1】:

以下是您编写查询的方式:

var query =
    from c in db.vw_categories
    join cl in db.vw_categoriesLocalization on c.level equals cl.level into clo
    from cl in clo.DefaultIfEmpty()
    where (cl == null || cl.language == "en")
          && c.level.StartsWith("000")
          && c.level != "000"
    select new
    {
        c.level,
        name = cl == null ? null : cl.name,
        c.quantity
    }

要将其转换为IEnumerable&lt;DataRow&gt;,也许您可​​以这样做:

var datarows = query.Select(r => {
    var row = dataTable.NewRow();
    row["level"] = r.level;
    row["name"] = r.name;
    row["quantity"] = r.quantity;
    return row;
});

【讨论】:

  • 好答案。但是我在这里有一个问题:我们可以通过写一次而不是两次来做到这一点。首先,它根据我们的需要进行获取,然后将查询结果转换为 DataRow。如果我会遵循那个,那么为什么我不会使用普通逻辑来循环并将记录添加到数据表中。任何建议..
【解决方案2】:

如果使用 LINQ to SQL:

var ctx = new SomeDataContext();
from c in ctx.vw_categories
join cl in ctx.vw_categoriesLocation
on c.level equals cl.level into g
from clv in g.DefaultIfEmpty()
where (clv == null || clv.language == "en")
&& c.level.Contains("000%")
&& c.level != "000"
select new
{
  c.level,
  name = (clv != null) ? clv.name : default(string),
  quantity = c.quantity
};

更多信息在这里:http://codingsense.wordpress.com/2009/03/08/left-join-right-join-using-linq/

【讨论】:

  • 我想你的意思是on c.level **equals** cl.level
  • 使用clv != null 将您的外连接变成内连接。你的意思可能是(clv == null || clv.language == "en")
  • @mattmc3 谢谢,是的,我总是把它弄混,所以没有智能感知 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多