Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.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
创建LINQ for SQL查询_Sql_Linq - Fatal编程技术网

创建LINQ for SQL查询

创建LINQ for SQL查询,sql,linq,Sql,Linq,我正在学习Linq和使用MVC。我编写了一个SQL查询,需要将其转换为LINQ查询 select TokenID,TokenAsset,packet from TokenTable where id = 6 and packet = '' and TokenID not in (select TokenID from TokenTable where id=6 and packet <> '') group by TokenID,TokenAsset,Packet 我恳请帮助将上述

我正在学习Linq和使用MVC。我编写了一个SQL查询,需要将其转换为LINQ查询

select TokenID,TokenAsset,packet from TokenTable where id = 6 and packet = ''
and TokenID not in (select TokenID from TokenTable where id=6 and packet <> '')
group by TokenID,TokenAsset,Packet
我恳请帮助将上述查询转换为LINQ查询。我知道SQL查询效率不高。如果你能帮我修一下就更好了。

试试这个:

var result = Tokens.Where(x=>x.Id==6 && 
                          x.Packet=="" &&
                          !Tokens.Exists(y=>y.TokenID==x.TokenID && 
                                            y.Id==6 && 
                                            y.Packet!="")
                   )
                   .GroupBy(x=>x.ID)
                   .ThenGroupBy(x=>x.TokenAsset)
                   .ThenGroupBy(x=>x.Packet);

请注意,我假设集合令牌包含您拥有的所有令牌

首先,您的SQL查询可以

select distinct TokenID, TokenAsset, packet 
from TokenTable 
where id = 6 and packet = ''
由于没有聚合列,group by没有那么有用。所有选定列都在group by子句中。使用distinct实现相同的效果

令牌ID的次要和条件也是冗余的。它对第一个条件是独占的,因此不会更改结果

使用此LINQ查询:

var results = dbcontext.TokenTables
              .Where(t => t.id == 6 && t.Packet == "")
              .Select(t => new { t.TokenId, t.TokenAsset, t.Packet }).Distinct();

通过避免额外的数据传输,只投影performant调用所需的列。

not in part发生了什么事?我认为我们不需要not。如果你看一下sql查询,你就会明白我的意思。我们需要id==6且其数据包为空的所有令牌。事实上,我想我们只想要这些唱片。否则,提供的查询就没有意义了。您是说删除它仍然会得到相同的结果吗?注意id和TokenID似乎是两个不同的字段。啊,我明白你的意思了,谢谢,我现在正在更正。谢谢建议使用distinct而不是group by是好的。但是,在不知道数据结构的情况下暗示第二个条件是冗余的可能是不正确的。您不知道TokenID字段有哪些值或空值。请注意,id和TokenID似乎是两个不同的字段。@Racil,无法将您的注释与查询关联。。查询的第一部分是id=6和packet=的所有令牌id,这意味着packet!=将由于和条件而被隐式排除。。如果我遗漏了什么,请告诉我。。很高兴理解并编辑我的理解是的,第一个条件将消除所有数据包。然而,第二种情况可能会消除更多。例如,假设TokenID是TokenTable的键,但如果不是呢?什么是身份证?如果某些id的TokenID存在重复值:假设id=6,ToketID=2,Packet=,id=6,TokenID=2,Packet='p',第一个条件将删除第二行,但第二个条件也将删除第一行。Racil最新的注释是正确的。Linq会按照评论工作吗?