2009-01-11 111 views

回答

84

如果您使用內存集合作爲過濾器,最好使用Contains()的否定。請注意,如果列表太長,這可能會失敗,在這種情況下,您需要選擇另一個策略(請參閱下面關於使用針對完全面向數據庫的查詢的策略)。

var exceptionList = new List<string> { "exception1", "exception2" }; 

    var query = myEntities.MyEntity 
         .Select(e => e.Name) 
         .Where(e => !exceptionList.Contains(e.Name)); 

如果你基於使用Except可能是一個更好的選擇另一個數據庫查詢排除。 (這裏是一個link在LINQ支持集擴展到實體)

var exceptionList = myEntities.MyOtherEntity 
           .Select(e => e.Name); 

    var query = myEntities.MyEntity 
         .Select(e => e.Name) 
         .Except(exceptionList); 

這是假設您在其中不包括根據其它表的某些屬性特定的一些和想要的不是實體的名稱複雜的實體排除。如果你想要整個實體,那麼你需要將異常構造爲實體類的實例,以使它們滿足默認的相等運算符(參見docs)。

+1

出於某種原因`Except`產生可怕的SQL 。 `Contains`是這裏使用的方法:`myEntities.MyEntity.Select(e => e.Name).Where(x =>!exceptionList.Contains(x))``。 – 2013-08-09 23:28:30

+0

@GertArnold,請您詳細說明「產生可怕的SQL」的說法嗎? 我使用Except,它工作得很好。 沒有古怪,也沒有表現怪癖,AFAIK。 – NinjaCross 2014-10-06 16:00:13

14

嘗試:

from p in db.Products 
where !theBadCategories.Contains(p.Category) 
select p; 

什麼是你想翻譯成LINQ查詢的SQL查詢?

4

我參加了一個列表,並使用

!MyList.Contains(table.columb.tostring()) 

注:請務必使用列表,而不是ILIST

5

我有以下的擴展方法:

public static bool IsIn<T>(this T keyObject, params T[] collection) 
    { 
     return collection.Contains(keyObject); 
    } 

    public static bool IsIn<T>(this T keyObject, IEnumerable<T> collection) 
    { 
     return collection.Contains(keyObject); 
    } 

    public static bool IsNotIn<T>(this T keyObject, params T[] collection) 
    { 
     return keyObject.IsIn(collection) == false; 
    } 

    public static bool IsNotIn<T>(this T keyObject, IEnumerable<T> collection) 
    { 
     return keyObject.IsIn(collection) == false; 
    } 

用法:

var inclusionList = new List<string> { "inclusion1", "inclusion2" }; 
var query = myEntities.MyEntity 
        .Select(e => e.Name) 
        .Where(e => e.IsIn(inclusionList)); 

var exceptionList = new List<string> { "exception1", "exception2" }; 
var query = myEntities.MyEntity 
        .Select(e => e.Name) 
        .Where(e => e.IsNotIn(exceptionList)); 

非常有用的以及直接傳值:

var query = myEntities.MyEntity 
        .Select(e => e.Name) 
        .Where(e => e.IsIn("inclusion1", "inclusion2")); 

var query = myEntities.MyEntity 
        .Select(e => e.Name) 
        .Where(e => e.IsNotIn("exception1", "exception2")); 
0

我創造了它更類似的方式到SQL,我認爲這是比較容易理解

var list = (from a in listA.AsEnumerable() 
      join b in listB.AsEnumerable() on a.id equals b.id into ab 
      from c in ab.DefaultIfEmpty() 
      where c != null 
      select new { id = c.id, name = c.nome }).ToList();