簡體   English   中英

實體框架-加入列表

[英]Entity Framework - Join to a List

我需要從數據庫中檢索與簡單列表(不是EF)中的項目列表匹配的實體列表。 Entity Framework 4.1是否可以實現?

例:

var list = new List<string> { "abc", "def", "ghi" };
var items = from i in context.Items
            where list.Contains(i.Name)
            select i;

返回匹配一個屬性的行效果很好,但實際上我有一個更復雜的屬性:

var list = new List<Tuple<string, string>>
{
    new Tuple<string,string>("abc", "123"),
    new Tuple<string,string>("def", "456")
};

// i need to write a query something like this:
var items = from i in context.Items
where list.Contains(new Tuple<string,string>(i.Name, i.Type))
select i;

我知道這是無效的,因為它將說它必須是原始類型,但是有什么方法可以完成我要完成的工作,還是需要訴諸存儲過程?

您需要將其細分為子屬性。 例如,類似的東西(可能無法編譯,目前我無法測試,但是應該可以使用):

var items = from i in context.Items 
where list.Select(x => x.Item1).Contains(i.Name) 
   && list.Select(x => x.Item2).Contains(i.Type)
select i; 

您有幾種選擇:

1)當然,您可以編寫存儲過程來執行所需的操作並調用它。

2)您可以將表讀入內存中,然后查詢內存中列表...這樣就不必使用原語了:

var items = from i in context.Items.ToList()
            where list.Contains(new Tuple<string, string>(i.Name, i.Type))
            select i;

3)您也可以將查詢轉換為使用基元來實現相同的目標:

 
 
 
 
  
  
  var items = from i in context.Items join l in list on new { i.Name, i.Type } equals new { Name = l.Item1, Type = l.Item2 } select i;
 
 
  

只要表不是很大,我就會選擇第二個選項。 否則,請選擇第一個。

您必須考慮生成的SQL的外觀,這很難直接在SQL中完成。

我的建議是將元組的一個字段拆分出來,並使用它來縮減結果列表,返回查詢結果,然后再次過濾以匹配其中一個元組,例如

var list = new List<string> { "abc", "def" };
var list2 = new List<Tuple<string, string>>
{
  new Tuple<string,string>("abc", "123"),
  new Tuple<string,string>("def", "456")
};
var items = (from i in context.Items
        where list.Contains(i.Name)
        select i)
        .AsEnumerable()
        .Where(i => list2.Any(j => j.val1 == i.Name && j.val2 == i.Type);

暫無
暫無

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

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