【问题标题】:LINQ: How Can I Use Equals in queryLINQ:如何在查询中使用 Equals
【发布时间】:2017-04-15 02:08:43
【问题描述】:

我需要使用 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);
    }

【问题讨论】:

  • 您当前的 Linq 在运行时生成什么 SQL?你确定它还没有使用IN?
  • 你为什么要问这个twice?如果一个问题没有得到想要的回应,你应该改进它,而不是重新发布。

标签: c# sql-server entity-framework linq


【解决方案1】:

如果foo.Contains( ) 中的foo 是IList&lt;T&gt;,则EF6 支持SQL IN 运算符,例如,此Linq:

Int32[] desired = new Int32[] { 1, 2, 3, 4 };

IQueryable<Item> itemsQuery = db.Items.Where( item => desired.Contains( item.SomeValue ) );

...将被转换成这个:

SELECT Item.* FROM Items WHERE SomeValue IN ( 1, 2, 3, 4 )

我并不完全确定具体细节,但我认为如果你将 selectedDeviceTypeIDs 从 IQueryable&lt;Guid&gt; 转换为 Guid[](或至少 IList&lt;Guid&gt;),那么 EF 也会生成一个 IN 查询你。

【讨论】:

  • 感谢您的帮助 :) 是的,生成的 t-sql 是 IN ... IN 的问题是当您 SELECT Item.* FROM Items WHERE SomeValue IN ( 1, 2, 3, 4 )如果它找到( 1 或 2 或 3 或 4 )它将返回结果......我不知道......我想要 SELECT Item.* FROM Items WHERE SomeValue equals ( 1, 2, 3, 4 ) got t ?
  • @Tom Oh - 您希望子项的整个序列匹配吗?
  • 是的戴,没错
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多