选择IN使用LINQ的位置

时间:2017-10-31 18:47:33

标签: c# linq

您好我试图在LINQ中使用IN条件。

我有以下查询:

select * from unitphotos Where MarketingFileTypeID = 2
AND UnitTypeID in (Select UnitTypeID from unitTypes Where PropertyID = 1)

我想我只能在一个LINQ查询中创建它,所以我这样做了:

var listUnitTypes = (from ut in db.unittypes
                     where ut.PropertyID == propertyID
                     select new { ut.UnitTypeID }).ToList();
var getPropertyPhotos = (from up in db.unitphotos
                         where listUnitTypes.Contains(up.UnitTypeID)
                         select up).ToList();

但是,它在Contains(up.UnitTypeID)中给出了一个语法错误:"参数1:无法转换为' int' to'匿名类型int UnitTypeID'

有谁知道我做错了什么?

由于

3 个答案:

答案 0 :(得分:3)

var getPropertyPhotos = (from up in db.unitphotos
                         where unittypes.Any(ut => ut.PropertyID == propertyID && ut.UnitTypeId == up.UnitTypeID)
                         select up).ToList();

我认为这应该有效。没有尝试过,因为我没有数据库虽然如此ymmv。

此外,如果您只是select new { ut.UnitTypeID }而不是select ut.UnitTypeID

,那么您的工作应该有效

答案 1 :(得分:2)

你这里有匿名类型

 var listUnitTypes = (from ut in db.unittypes where ut.PropertyID == propertyID select new { ut.UnitTypeID }).ToList();

然后尝试在Linq To Entity中使用它:

        var getPropertyPhotos = (from up in db.unitphotos
                                 where listUnitTypes.Contains(up.UnitTypeID)
                                 select up).ToList();

似乎Linq to Entity不知道那种类型是什么。

所以你可以替换

 select new { ut.UnitTypeID }) 

 select { ut.UnitTypeID })

在@anakic悲伤之前

然后由Linq创建1个查询

var listUnitTypes = (from ut in db.unittypes where ut.PropertyID == propertyID select ut.UnitTypeID);

var getPropertyPhotos = (from up in db.unitphotos where listUnitTypes.Contains(up.UnitTypeID) select up).ToList();

通过这种方式,你强迫Linq创建复杂的查询,应该能够处理你的问题。

答案 2 :(得分:0)

我认为你正在接近强迫子选择问题的方式最终会让你回到数据库而不是必须。我现在没有可用的IDE来敲出正确的LINQ语法,但为什么不改变你的方法从SQL子选择到JOIN的思考?这是我将开始的SQL,然后将其转换为LINQ:

# dependencies
require(sparkline)
require(DT)
require(shiny)

# create data with sparklines
spark_data <- data.frame(
  id = c('spark1', 'spark2'),
  spark = c(
    spk_chr(values = 1:3, elementId = 'spark1'),
    spk_chr(values = 3:1, elementId = 'spark2')
  )
)

###  adding this <------------
cb <- htmlwidgets::JS('function(){debugger;HTMLWidgets.staticRender();}')

ui <- fluidPage(
  ###  and this <------------
  htmlwidgets::getDependency('sparkline'),
  dataTableOutput("tbl")
)

server <- function(input, output) {

  output$tbl <- renderDataTable(
    expr = spark_data,
    escape = FALSE,
    ###  and this <------------
    options = list(
      drawCallback =  cb
    )
  )
}

shinyApp(ui = ui, server = server)