C# c实体框架混合linq到对象和linq到实体

C# c实体框架混合linq到对象和linq到实体,c#,entity-framework,linq-to-entities,linq-to-objects,C#,Entity Framework,Linq To Entities,Linq To Objects,我有一个数据库,我想搜索哪些值 若要搜索某些内容,用户需要选择特定的复选框,该复选框的值包含在内存中的列表中,否则复选框的任何更改值都将导致保存数据库,这是我想要避免的 我的数据库中的数据由 .装载 方法 所以,我的问题是idk如何构造混合数据库值和内存真/假值的查询 var query1 = from i in db.MyValuesTable from j in MyMemoryObjects where j.IsTrue &&

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

若要搜索某些内容,用户需要选择特定的复选框,该复选框的值包含在内存中的列表中,否则复选框的任何更改值都将导致保存数据库,这是我想要避免的

我的数据库中的数据由

.装载

方法

所以,我的问题是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代码下面

//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; }
}

通常不支持将LINQ to实体与LINQ to对象混合使用。实际上,唯一受支持的构造是应用于内存中原语类型IEnumerable的Contains方法,它在value1、value2、。。。条款

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

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

// ...

你的问题不清楚。请理解。我想做一个混合linq到实体和linq到对象的查询,返回一个正确的结果,如果query2没有抛出异常,则应返回该结果,并显示消息:无法创建类型的常量值,此上下文中仅支持基元或枚举类型