如何在LINQ-to-Entities 3.5中执行"值在何处"

时间:2020-03-06 14:19:18  来源:igfitidea点击:

有人知道如何使用LINQ-to-Entities应用"值在何处"类型条件吗?我尝试了以下方法,但不起作用:

var values = new[] { "String1", "String2" };  // some string values

var foo = model.entitySet.Where(e => values.Contains(e.Name));

我相信这在LINQ-to-SQL中有效吗?有什么想法吗?

解决方案

是的,它确实转换为SQL,它会生成一个标准的IN语句,如下所示:

选择[t0]。[col1]
来自[表格] [t0]
WHERE [col1] IN("值1","值2")

使用where方法始终无法正常工作

var results = from p in db.Products

             where p.Name == nameTextBox.Text

             select p;

更新:了解如何执行此操作。 EF将在数据库上生成适当的SQL。我不确定这是否仅适用于EF4,但我从Entity Framework 4.0食谱中获得了提示

var listOfIds=GetAListOfIds();
var context=CreateEntityFrameworkObjectContext();
var results = from item in context.Items
              where listOfIds.Contains(item.Category.Id)
              select item;
//results contains the items with matching category Ids

此查询在服务器端生成正确的in子句。我尚未使用EF 3.5对其进行过测试,但它确实可以与EF4一起使用。

注意:传入in子句的值不是NOT参数,因此请确保我们验证输入。

遗憾的是,Linq to Entities不支持Contains。

IN和JOIN运算符不同(按IN进行过滤永远不会更改查询的基数)。

EF目前不支持包含。

供参考:

如果我们使用的是ESql,则可以在操作中使用。
我没有VS 2008,但代码应如下所示:

var ids = "12, 34, 35";
using (context = new Entites())
{
    var selectedProducts = context.CreateQuery<Products>(
        String.Format("select value p from [Entities].Products as p 
                       where p.productId in {{{0}}}", ids)).ToList();
    ...
}