繁体   English   中英

无法获取包含在Linq查询where子句中的工作

[英]Can't get Contains to work in Linq query where clause

        List<Guid> toBeFilteredCarIds = new List<Guid>();
        toBeFilteredCarIds.Add(new Guid("4cc70c3a-405c-4a5c-b2cd-0429a5bc06ef"));

        var cars = ef.Cars
            .Include("CarProfile.Option.OptionType")
            .Where(c => c.CarStatusId == 1);

        cars.Join(ef.CarProfile,
            t1 => t1.CarId,
            t2 => t2.Car.CarId,
            (t1, t2) => new { t1, t2 }).Where(o => o.t2.IsActive == true).Select(o => o.t1);

        var filteredCars = cars.ToList().Where(u => toBeFilteredCarIds.Contains(u.CarId));

上面的代码试图获取Car的列表,其中CarProfile处于活动状态,CarId位于toBeFilteredCarIds列表中。

但是正如您在最后一行中所看到的,我首先执行.ToList()然后执行Where子句以通过CarIds进行过滤。

这显然会让所有汽车首先来自DB,然后进行过滤。 这是非常昂贵的。

我尝试过别人在其他答案上建议的方式:

        List<Guid> toBeFilteredCarIds = new List<Guid>();
        toBeFilteredCarIds.Add(new Guid("4cc70c3a-405c-4a5c-b2cd-0429a5bc06ef"));

        var cars = ef.Cars
            .Include("CarProfile.Option.OptionType")
            .Where(c => toBeFilteredCarIds.Contains(c.CarId) && c.CarStatusId == 1);

        cars.Join(ef.CarProfile,
            t1 => t1.CarId,
            t2 => t2.Car.CarId,
            (t1, t2) => new { t1, t2 }).Where(o => o.t2.IsActive == true).Select(o => o.t1);

        var filteredCars = cars.ToList();

但这不适合我,它给了我这个错误:

LINQ to Entities无法识别方法'Boolean Contains(System.Guid)'方法,并且此方法无法转换为商店表达式。

我可以在stackoverflow上看到,很多已标记为回答上述方法:

.Where(c => toBeFilteredCarIds.Contains(c.CarId)

但它不适合我。

通过他们的方式使用:VS2008,EF 3.5,我已经使用System.Data.Entity; 在我的使用陈述中。

上面使用的“Include”很重要,因为我需要事先得到所有东西,因为会有大量的循环读取数据。

直到4.0才添加ContainsIEnumerable Contains ,所以如果你遇到3.5,你需要做一些事情,比如在发送查询之前展开这些值。

请看: http//blogs.msdn.com/b/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx

由于.NET 3.5不支持Contains,因此您可以使用Dynamic Linq Library,它允许您使用字符串生成where子句。 这样,您就不必使用所有Expression语言。

可在NuGet上获得: https//www.nuget.org/packages/System.Linq.Dynamic.Library/

你的Where子句看起来像这样:

.Where("CarStatusId=1 AND (CarId=1 OR CarId=2 OR CarId=3"))

您只需要根据toBeFilteredCarIds列表生成该字符串。

你可以使用Any() 不像Contains()那么优雅,但它在.NET 3.5中完成了这项工作:

.Where(c => toBeFilteredCarIds.Any(g => g == c.CarId) && c.CarStatusId == 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM