c#实体框架将linq混合到具有linq到实体的对象

时间:2017-08-07 07:58:59

标签: c# entity-framework linq-to-entities linq-to-objects

我有数据库,我想搜索哪些值。

要搜索某些内容,用户需要选择特定的复选框,其中的值包含在内存中的列表中(否则复选框的任何更改值都会导致保存数据库,我想避免这种情况)。

我的数据库中的数据由

加载
  

.Load()

方法

所以,我的问题是idk如何构造查询,将我的数据库值与内存真/假值混合。

var query1 = from i in db.MyValuesTable
              from j in MyMemoryObjects
              where j.IsTrue && j.Id == i.Tab2Id && i.Value.Contains(_searchPhrase)
              select i;

(from i in db.TableToLoad
from j in query1
where i.CollectionWithValues.Any(x => x.Tab1Id == j.Tab1Id && x.Tab2Id == j.Tab2Id).select i).Load();

我的查询可能有点混乱,所以我将下面的数据库方案(EF Code First)

//db object
public class MyValuesTable
{
   public int Tab1Id { get; set; }
   public int Tab2Id { get; set; }
   public string Value { get; set; }
}

//memory object
public class MyMemoryObjects
{
   public int Id { get; set; }
   public bool IsTrue { get; set; }
}

//db object
public class TableToLoad
{
   public int Tab1Id { get; set; }
   public int Tab2Id { get; set; }
   public string Value { get; set; }
}

1 个答案:

答案 0 :(得分:3)

通常不支持将LINQ混合到具有LINQ to Objects的实体。实际上,唯一受支持的构造是在内存基元类型Contains中应用的IEnumerable<T>方法,该方法转换为SQL IN (value1, value2, ...)子句。

幸运的是,它适用于您的场景,因为j.IsTrue && j.Id == i.Tab2Id条件可以转换为应用了j.Id过滤器的j.IsTrue内存列表,然后可以在LINQ to Entities查询中使用作为Contains条件:

// has to be variable outside of the L2E query
var idFilter = from j in MyMemoryObjects
               where j.IsTrue
               select j.Id;

var query1 = from i in db.MyValuesTable
             where idFilter.Contains(i.Tab2Id) // <-- and use it inside
                 && i.Value.Contains(_searchPhrase)
             select i;

// ...