Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQL内部选择到LINQ_C#_Sql_.net_Linq_Datagrid - Fatal编程技术网

C# SQL内部选择到LINQ

C# SQL内部选择到LINQ,c#,sql,.net,linq,datagrid,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和一个表b,表a有文章,表b有价格历史记录 现在我需要一个datagrid,在这里我可以为表a输入新条目,这样视图就不工作了,并且在保

这件事快把我逼疯了

我觉得没那么复杂,但我不明白

我有一个正在工作的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和一个表b,表a有文章,表b有价格历史记录

现在我需要一个datagrid,在这里我可以为表a输入新条目,这样视图就不工作了,并且在保存了它的ShowMe关联价格之后


我希望我可以理解地表达我自己,我不确定你的目标是哪种语法,但其中一种应该可以做到。不过我还没有测试过

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
};


要将SQL转换为LINQ查询理解,请执行以下操作:

将Subselect转换为单独声明的变量。 按照LINQ子句顺序翻译每个子句,将一元运算符DISTINCT、TOP等作为应用于整个LINQ查询的函数。 使用表别名作为范围变量。使用列别名作为匿名类型字段名。 对多个列使用匿名类型new{} 左连接是通过使用into Join_变量并从Join变量执行另一个操作,后跟.DefaultIfEmpty来模拟的。 将COALESCE替换为条件运算符和null测试。 SELECT*必须替换为SELECT range_变量,对于联接,则替换为包含所有范围变量的匿名对象。 必须用SELECT new{…}替换SELECT字段以创建包含所有所需字段或表达式的匿名对象。 必须使用扩展方法处理正确的完全外部联接。 对于您的查询:

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()
          };

那你已经试过什么了?我在你的帖子中没有看到任何c代码。首先我尝试在视图中编写,但visual studio说我做不到:P然后我尝试将内部选择重写为联接,因为我认为我可以进行linq联接。但加入我不知道如何加入只有前1。。。所以没有代码yetexample.Selectx=>sample.c=>c.Id==x.Id和c.Date==x.Date应该给你一个确定的点来解决这个问题。我会先用x=>x。省去了以后执行的步骤。首先,因为SQL子查询只选择前1项。@JustinasMarozas是的,那会更好。可能要先执行FirstOrDefault,这样当返回多个查询时,查询不会内爆。@Greg我想你是在混淆Single。@JustinasMarozas我想你忘记了查询理解表单中的范围变量。说得好,@Greg。更新了答案。我通常避免使用“*OrDefault”方法,因为在许多情况下,我宁愿有一个异常告诉我我的数据是坏的,而不是空值。@NetMage是的,我总是混淆这两种方法。
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()
          };