2017-08-07 163 views
0

我有我想要搜索的数据库值。c#实体框架混合LINQ到LINQ到实体的对象

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

从我的数据库的数据由

.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代码第一次)

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

你问题不清楚。请理解。 –

+0

我想要查询哪些混合linq实体和​​linq到对象返回正确的结果(如果query2不会引发异常与消息应该返回:“无法创建类型的常量值只有原始类型或支持枚举类型在这方面“) – d3st1ny

回答

2

混合LINQ与LINQ实体到对象一般不支持。实际上,唯一受支持的构造是Contains方法应用于内存原语类型IEnumerable<T>,这转换为SQL IN (value1, value2, ...)子句。

幸运的是,它是适用于您的方案,因为j.IsTrue && j.Id == i.Tab2Id标准可以在j.Id内存列表转换为与j.IsTrue过滤应用,然后可以在LINQ中可用于实体查询为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; 

// ...