什么是以下sql查询的linq等价物

时间:2015-01-29 11:10:28

标签: c# sql linq

select Productid from categories where `categoryname` in `('abc','def','ghi')`; 

我试过这个:

var res = from catg in db.Categories where catg.CategoryId.ToString().Contains(SelectedProducts) select catg;

但这似乎不起作用......

3 个答案:

答案 0 :(得分:5)

假设SelectedProducts是一个产品ID数组(整数):

var cats = db.Categories.Where(o => SelectedProducts.Contains(o.CategoryId));
var pids = cats.Select(o => o.ProductId);

原因:SQL IN运算符在LINQ到SQL中相反实现。这个问题突出了LINQ开发人员试图从SQL翻译时常见的错误,期望[attribute] [operator] [set]语法。

使用抽象集语言,我们可以突出显示语法差异

  • SQL在“设置”语法
  • 中使用“元素is included
  • LINQ使用“设置contains元素”语法

因此必须使用IN运算符还原任何Contains子句。无论如何它都会转换为attribute IN (SET)

答案 1 :(得分:3)

您需要在 SelectedProducts

上使用Contains
var res = from catg in db.Categories where 
SelectedProducts.Contains(catg.categoryname) select catg.Productid;

使用方法表示法

var res = db.Categories.Where(catg => SelectedProducts
            .Contains(catg.categoryname)).Select(catg.Productid);

答案 2 :(得分:3)

SQL IN与IEnumerable.Contains()的等价性:

var res = from catg in db.Categories 
          where new[] {"abc","def","ghi"}.Contains(catg.categoryname) 
          select catg.Productid

或lambda

db.Categories.Where(x => new[] {"abc","def","ghi"}.Contains(x.categoryname)).Select(c => c.ProductId);