C# 将包含IN语句的SQL转换为可链接的LINQ

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

我正在尝试将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
  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();