2017-08-07 210 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; 

// ...