C# SQL内部选择到LINQ
这件事快把我逼疯了 我觉得没那么复杂,但我不明白 我有一个正在工作的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输入新条目,这样视图就不工作了,并且在保
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()
};