2017-04-15 15 views
0

Containsメソッドを使用する代わりにEqualsメソッドなどを使用する必要があります。データベース内の正確な値を配列selectedDeviceTypeIDsで検索したいからです。ここでContainsの代わりにExact配列の値を使用する方法

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) 
       ) 
      ) 
     ) 
    ); 

私の完全なコードは、あなたの問題はContains()ではないが、それはそのDeviceTypeIDにあるデバイスを発見した直後にを返します。クエリで使用Any()方法で

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); 
} 
+0

あなたの質問が何であるかはっきりしません。 「正確な値」はどういう意味ですか?あなたは内容の例と結果が期待されるものを挙げることができますか? –

+1

サイドノート - '.AsEnumerable()'は冗長です - 既に 'IEnumerable'です –

+0

あなたはそれに参加する必要があります。 'arからxのレコードを取得する場所from ... select ...' – abatishchev

答えて

0

ですselectedDeviceTypeIDsリストを提供しました。

あなたはユニットの試合のすべてのデバイス場合は、リスト内のすべての項目をチェックする必要がある場合は、あなたが使用できます。あなたはDevicesselectedDeviceTypeIDsではなく、中に重複するアイテムを持っている場合は、その

query = query 
.Where(j => 
    j.HospitalDepartments.Any(jj => 
     jj.Units.Any(m => 
      m.Devices.All(
       w => selectedDeviceTypeIDs.Contains(w.DeviceTypeID)) 
      && 
      selectedDeviceTypeIDs.All(
       g => m.Devices.Select(d => d.DeviceTypeID).Contains(g)) 
     ) 
    ) 
); 

注意Unitのうち、それでもtrueを返します。

関連する問題