簡體   English   中英

c#實體框架將linq混合到具有linq到實體的對象

[英]c# entity framework mixing linq to objects with linq to entities

我有數據庫,我想搜索的值。

要搜索某些內容,用戶需要選擇特定的復選框,其中的值包含在內存中的列表中(否則復選框的任何更改值都會導致保存數據庫,我想要避免)。

來自我的數據庫的數據被加載

。加載()

方法。

所以,我的問題是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; }
}

通常不支持將LINQ與實體混合使用LINQ to Objects。 實際上,唯一受支持的構造是在內存基元類型IEnumerable<T>應用的Contains方法,它轉換為SQL IN (value1, value2, ...)子句。

幸運的是,它適用於您的場景,因為j.IsTrue && j.Id == i.Tab2Id標准可以轉換為j.Id內存列表, j.Idj.IsTrue過濾器,然后可以在LINQ to Entities查詢中使用as 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;

// ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM