SQL内部选择LINQ

时间:2018-01-09 21:50:10

标签: c# sql .net linq datagrid

这个的事情让我发疯。

我认为它并不复杂,但我不明白。

我有这个有效的SQL语句,我需要Linq语句。

select 
    a.id, a.date, 
    (select top 1 b.price from b where a.id = b.id and a.date >= b.date) as price 
from a;

解释:

我有一张带有文章的表格和一张带有价格历史记录的表格。

现在我需要一个数据网格,我可以在其中输入表a的新条目(因此视图不起作用)并在保存后显示我的相关价格

我希望我可以理解地表达自己

2 个答案:

答案 0 :(得分:3)

将SQL转换为LINQ查询理解:

  1. FROM子选项翻译为单独声明的变量。
  2. 以LINQ子句顺序翻译每个子句,将monadic运算符(DISTINCT,TOP等)作为应用于整个LINQ查询的函数。
  3. 使用表别名作为范围变量。使用列别名作为匿名类型字段名称。
  4. 对多列使用匿名类型(new {})
  5. 使用into join_variable模拟左连接,然后从连接变量后跟.DefaultIfEmpty()进行另一次连接。
  6. 将COALESCE替换为条件运算符和空值测试。
  7. SELECT *必须替换为select range_variable或者连接,一个包含所有范围变量的匿名对象。
  8. SELECT字段必须替换为select new {...},创建一个包含所有所需字段或表达式的匿名对象。
  9. 必须使用扩展方法处理正确的FULL OUTER JOIN
  10. 查询:

    var ans = from ra in a
              select new {
                  ra.id,
                  ra.date,
                  price = (from rb in b
                           where ra.id == rb.id && ra.date >= rb.date
                           select rb.price).First()
              };
    

答案 1 :(得分:0)

我不确定你的目标是哪种语法,但其中一种应该可以解决问题。我没有测试过它。

from xa in a
select new
{
    id,
    date,
    price = (
        from xb in b
        where xa.id == xb.id && xa.date >= xb.date
        select xb.price
    ).First() // or .FirstOrDefault() if you want to allow null prices
};

a.Select(xa => new
{
    id,
    date,
    price = b.First(xb => xa.id == xb.id && xa.date >= xb.date) // or .FirstOrDefault() if you want to allow null prices
});