C# 将包含IN语句的SQL转换为可链接的LINQ
我正在尝试将MSSQL语句转换为LINQ。整个功能分为许多LINQ语句,这些语句组合在一起,因此结果必须返回类型IQueryable 这个问题包括一个模式和数据的示例。我试图查看Number的最新(按日期创建)值是否等于400,如果是,请返回Table1Id 以下是MSSQL语句C# 将包含IN语句的SQL转换为可链接的LINQ,c#,sql,linq,entity-framework,lambda,C#,Sql,Linq,Entity Framework,Lambda,我正在尝试将MSSQL语句转换为LINQ。整个功能分为许多LINQ语句,这些语句组合在一起,因此结果必须返回类型IQueryable 这个问题包括一个模式和数据的示例。我试图查看Number的最新(按日期创建)值是否等于400,如果是,请返回Table1Id 以下是MSSQL语句 select * from Table1 t1 where 400 in ( select top 1 t2.Number from Table2 t2 where t2.Table1Id = t1.id
select * from Table1 t1
where 400 in (
select top 1 t2.Number
from Table2 t2
where t2.Table1Id = t1.id
order by t2.DateCreated desc
)
到目前为止,我提出的LINQ是:
//initial query
var query1 = _table1Repository.Table
//chain our query
var query2 = from t1 in query1
where ((from t2 in _table2Repository.Table
where t2.Table1Id == t1.Id
orderby t2.DateCreated descending
select t2.Number)
.Take(1)).Contains(400)
select t1;
//execute the query (may be more queries between last query and this)
var queryResult = query2.ToList();
尽管在执行时会引发以下错误:
无法创建“Project.Domain.Table2”类型的常量值。在此上下文中仅支持基元类型或枚举类型。
Table 1 data
| Id |
|----|
| 1 |
| 2 |
| 3 |
Table 2 data
| Id | DateCreated | Table1Id | Number |
|----|------------ |-----------|---------|
| 1 | 1/1/2014 | 1 | 100 |
| 2 | 2/1/2014 | 1 | 200 |
| 3 | 3/1/2014 | 1 | 300 |
| 4 | 1/1/2014 | 2 | 200 |
| 5 | 2/1/2014 | 2 | 300 |
| 6 | 3/1/2014 | 2 | 400 |
| 7 | 1/1/2014 | 3 | 400 |
| 8 | 2/1/2014 | 3 | 300 |
| 9 | 3/1/2014 | 3 | 200 |
Expected result
| Id |
|----|
| 2 |
假设您仍然希望在关键字中使用
,Lambda版本如下所示:
var intList = new List<int>(1) { 400 };
var test = _table1Repository.Table
.Where(t1 => intList.Contains(_table2Repository.Table
.Where(t2 => t2.Table1Id == t1.id)
.OrderByDescending(t2 => t2.Number)
.First()));
在SQL中,100是字段名吗?此外,我以前从未见过中的语法与一个值一起使用。我不确定您提供的sql是否清楚地显示了您试图实现的目标,因为您的预期结果与我的预期不同。假装我很傻,你能描述一下你想做什么吗?啊,你把它改成了400,现在变成了400sense@RobWhite,道歉100意味着400。谢谢你指出这一点。问题经修正。值400为常数,以简化问题。实际上,它是C#中的一个变量。@ErikPhilips SQL语句可以工作。ORDERBY在那里,只是不是大写的。。应进行修改以使其更易于查看。是否要返回表1中具有表2中指定编号的匹配Id的Id?Erik我设法使您的解决方案工作,但我正在链接另一个LINQ查询,因此解决方案必须是LINQ而不是Lambda.var intList=new List(1){400};var test=_table1Repository.Table.Where(t1=>intList.Contains(_table2Repository.Table.Where(t2=>t2.Table1Id==t1.Id)。OrderByDescending(t2=>t2.Id)。选择(t2=>t2.Number.First());Linq和Lamdba表达式是相同的,它们可以任意一起使用。链接到另一个Linq语句时,我收到与最初相同的错误(无法创建“Project.Domain.Table2”类型的常量值。在此上下文中仅支持基元类型或枚举类型)。我怀疑这与使用.First()或.Contains()有关。如果看不到代码(您总是可以使用其他代码更新您的问题),我不知道如何提供帮助。我将用一个例子更新我的问题。
var query1 = _table1Repository.Table
.OrderBy(t1 => t1.id);
var query2 = (from t1 in query1
select new { Id = t1.Id, Number = number } );
var query3 = query2.ToList();