2016-01-08 111 views
1

我正在開發一個.NET Framework 4.0和Entity Framework 6.1.3的C#庫。使用lambda表達式檢查表中是否存在產品

我有一個這個變量List<ProductViewModel> viewModel。我想檢查產品表上是否存在該變量的一些產品。

ProductViewModel聲明:

public class ProductViewModel 
{ 
    public string ProductCode { get; set; } 
    public string ProductDescription { get; set; } 
} 

我已經測試了這個謂詞:

Expression<Func<PRODUCTS, bool>> predicate = 
    p => (p.LAW == (byte)LawTypes.Korea) && 
     !viewModel.Any(item => item.ProductCode == p.PRODUCT_CODE); 

這一個:

Expression<Func<PRODUCTS, bool>> predicate = 
    p => (p.LAW == (byte)LawTypes.Korea) && 
     !viewModel.Select(x => x.ProductCode).Contains(p.PRODUCT_CODE); 

當我這樣做有兩個謂詞:

if (_dbSet.Where(predicate).Count() == 0) 

我得到以下異常:

無法創建 類型的恆定值 'MyProject.Web.API.Models.ProductViewModel'。在此上下文中僅支持基本類型或枚舉類型。

PRODUCTS是:

public class PRODUCTS 
{ 
    public int Id { get; set; } 
    public string PRODUCT_CODE { get; set; } 
    public string DESCRIPTION { get; set; } 
    public byte LAW { get; set; } 
} 

我怎樣才能解決這個問題?

回答

0

您的問題是,你假設使用expressiontree您的LINQ可以訪問你的本地變量viewModel

Expression<Func<PRODUCTS, bool>> predicate = 
p => (p.LAW == (byte)LawTypes.Korea) && 
    !viewModel.Any(item => item.ProductCode == p.PRODUCT_CODE); 

您將通過此表達對LINQ查詢,這根本不知道所有你用viewModel表示。

你或許應該使用ProductCode爲外鍵使ProductViewModelProduct之間的連接:

public class PRODUCTS 
{ 
public int Id { get; set; } 
[ForeignKey("ProductViewModels")] 
public string PRODUCT_CODE { get; set; } 
public string DESCRIPTION { get; set; } 
public byte LAW { get; set; } 

public virtual ICollection<ProductViewModel> ProductViewModels {get; set;} 
} 

然後,你可以寫你的表達如下:

Expression<Func<PRODUCTS, bool>> predicate = 
p => (p.LAW == (byte)LawTypes.Korea) && 
    !p.ProductViewModels.Any(); 

只要確保你做出正確的產品和視圖模型之間的關係,我認爲它是一對多的。如果首先是數據庫,則必須在數據庫中定義外鍵。