123var values = new[] {"String1","St"/>

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

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

How to do a “where in values” in LINQ-to-Entities 3.5

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

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

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

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


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

获得了提示

1
2
3
4
5
6
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参数,因此请确保您验证输入。


对于在查询数据时要使用表达式的情况,可以使用以下扩展方法(在http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/095745fe之后进行适应-dcf0-4142-b684-b7e4a1ab59f0 /):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Data.Objects;

namespace Sample {
    public static class Extensions {
        public static IQueryable< T > ExtWhereIn<T, TValue>(this ObjectQuery< T > query,
                    Expression<Func<T, TValue>> valueSelector,
                    IEnumerable<TValue> values) {
            return query.Where(BuildContainsExpression<T, TValue>(valueSelector, values));
        }
        public static IQueryable< T > ExtWhereIn<T, TValue>(this IQueryable< T > query,
            Expression<Func<T, TValue>> valueSelector,
            IEnumerable<TValue> values) {
            return query.Where(BuildContainsExpression<T, TValue>(valueSelector, values));
        }
        private static Expression<Func<TElement, bool>> BuildContainsExpression<TElement, TValue>(
                Expression<Func<TElement, TValue>> valueSelector, IEnumerable<TValue> values) {
            if (null == valueSelector) { throw new ArgumentNullException("valueSelector"); }
            if (null == values) { throw new ArgumentNullException("values"); }
            ParameterExpression p = valueSelector.Parameters.Single();
            // p => valueSelector(p) == values[0] || valueSelector(p) == ...
            if (!values.Any()) {
                return e => false;
            }
            var equals = values.Select(value => (Expression)Expression.Equal(valueSelector.Body, Expression.Constant(value, typeof(TValue))));
            var body = equals.Aggregate<Expression>((accumulate, equal) => Expression.Or(accumulate, equal));
            return Expression.Lambda<Func<TElement, bool>>(body, p);
        }
    }
    class Program {
        static void Main(string[] args) {
            List<int> fullList = new List<int>();
            for (int i = 0; i < 20; i++) {
                fullList.Add(i);
            }

            List<int> filter = new List<int>();
            filter.Add(2);
            filter.Add(5);
            filter.Add(10);

            List<int> results = fullList.AsQueryable().ExtWhereIn<int, int>(item => item, filter).ToList();
            foreach (int result in results) {
                Console.WriteLine(result);
            }
        }
    }      
}

使用扩展确实非常容易(如您在示例中所见)。要在数据库对象上使用它,假设您要通过多个id过滤一个名为" Product"的表,则可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
class Product {
    public int Id { get; set; }
    /// ... other properties
}


List<Product> GetProducts(List<int> productIds) {    
    using (MyEntities context = new MyEntities()) {
        return context.Products.ExtWhereIn<Product, int>(product => product.Id, productIds).ToList();
    }
}

仅供参考:

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

1
2
3
4
5
6
7
8
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();
    ...
}

当前EF不支持包含。


Linq to Entities不支持Contains,这有点遗憾。

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


使用where方法始终不起作用

1
2
3
4
5
var results = from p in db.Products

             where p.Name == nameTextBox.Text

             select p;

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

1
2
3
SELECT [t0].[col1]
FROM [table] [t0]
WHERE [col1] IN ( 'Value 1', 'Value 2')


推荐阅读

    linux操作数据库命令?

    linux操作数据库命令?,地址,服务,系统,密码,数据库,工具,名字,首页,命令,参

    linux系命令的操作?

    linux系命令的操作?,工作,系统,信息,网络,命令,基础,简介,管理,目录,操作,lin

    linux执行多次命令?

    linux执行多次命令?,系统,信息,标准,工作,情况,命令,周期性,服务,代码,时间,l

    linux显示操作命令?

    linux显示操作命令?,系统,工作,地址,信息,管理,命令,目录,基础,工具,标准,lin

    linux并行化执行命令?

    linux并行化执行命令?,系统,工具,信息,命令,名称,网络,管理,首页,服务,暂停,L

    如何执行linux命令?

    如何执行linux命令?,单位,系统,网络,信息,权威,命令,文件,音乐,目录,选项,mv

    linux打断执行的命令?

    linux打断执行的命令?,系统,状态,网站,标准,通用,客服,人员,名字,网络,暂停,L

    linux操作常用命令?

    linux操作常用命令?,工作,系统,地址,信息,命令,目录,管理,标准,基础,工具,lin

    linux命令没执行完?

    linux命令没执行完?,系统,设备,工具,情况,密码,状态,电脑,管理,材料,服务,Lin

    linux操作命令重命名?

    linux操作命令重命名?,图片,软件,名称,名字,文件,命令,状态,代码,工具,系统,L

    shell中执行linux命令?

    shell中执行linux命令?,系统,名称,环境,管理,工作,代码,技术,软件,经理,基础

    linux打印命令执行?

    linux打印命令执行?,信息,系统,工具,服务,命令,发行,基础,位置,设备,时间,怎

    linux执行两次命令?

    linux执行两次命令?,系统,信息,连续,名称,命令,初级,首页,工具,管理,终端,lin

    linux命令执行安装?

    linux命令执行安装?,软件,系统,管理,网站,官网,市场,中心,最新,灵活,工作,如

    linux执行一条新命令?

    linux执行一条新命令?,系统,工作,命令,管理,网络,服务,信息,目录,路径,脚本,L

    linux目录操作命令d?

    linux目录操作命令d?,工作,系统,信息,命令,情况,基础,数据,名称,地址,目录,li

    监控linux执行命令?

    监控linux执行命令?,系统,情况,数据,实时,网络,信息,状态,时间,设备,命令,如

    linux初学者操作命令?

    linux初学者操作命令?,工作,系统,信息,命令,网络,地址,单位,位置,管理,数据,L

    linux操作命令远程?

    linux操作命令远程?,软件,密码,系统,名称,图片,电脑,地址,网站,工具,服务,如

    linux命令卡死不执行?

    linux命令卡死不执行?,系统,设备,数据,密码,工具,情况,软件,环境,分析,命令,l