我需要使用Equals方法或其他类似的方法,而不是使用Contains方法,因为我想在数据库中搜索selectedDeviceTypeIDs数组中的确切值,而不是其中的任何值。
IEnumerable<Guid> selectedDeviceTypeIDs = DeviceTypeIDs
.Split(',')
.Select( Guid.Parse )
.AsEnumerable();
query = query
.Where( j =>
j.HospitalDepartments.Any( jj =>
jj.Units.Any( m =>
m.Devices.Any( w =>
selectedDeviceTypeIDs.Contains( w.DeviceTypeID )
)
)
)
);下面是我的完整代码:
public HttpResponseMessage GetAvailableHospitalsByAjax(System.Guid? DirectorateOfHealthID = null, System.Guid? UnitTypeID = null, string DeviceTypeIDs = null)
{
Context db = new Context();
var query = db.Hospitals.AsQueryable();
if (DeviceTypeIDs != null)
{
IEnumerable<Guid> selectedDeviceTypeIDs = DeviceTypeIDs.Split(',').Select(Guid.Parse).AsEnumerable();
query = query.Where(j => j.HospitalDepartments.Any(jj => jj.Units.Any(m => m.Devices.Any(w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID)))));
}
if (UnitTypeID != null)
{
query = query.Where(j => j.HospitalDepartments.Any(www => www.Units.Any(u => u.UnitTypeID == UnitTypeID)));
}
if (DirectorateOfHealthID != null)
{
query = query.Where(h => h.DirectorateHealthID == DirectorateOfHealthID);
}
query = query.Where(j => j.HospitalDepartments.Any(u => u.Units.Any(d => d.Devices.Any(s => s.Status == Enums.DeviceStatus.Free)))
&& j.HospitalDepartments.Any(hd => hd.Units.Any(u => u.Beds.Any(b => b.Status == Enums.BedStatus.Free))));
var list = query.ToList();
return Request.CreateResponse(HttpStatusCode.OK, list);
}发布于 2017-04-15 02:08:17
如果EF6中的IN是一个foo,那么foo.Contains( )支持SQL IList<T>运算符,例如,这个Linq:
Int32[] desired = new Int32[] { 1, 2, 3, 4 };
IQueryable<Item> itemsQuery = db.Items.Where( item => desired.Contains( item.SomeValue ) );将...will转换为:
SELECT Item.* FROM Items WHERE SomeValue IN ( 1, 2, 3, 4 )我不能完全确定具体细节,但我认为如果您将selectedDeviceTypeIDs从IQueryable<Guid>转换为Guid[] (或者至少是IList<Guid>),那么EF也会为您生成一个IN查询。
https://stackoverflow.com/questions/43416577
复制相似问题