2010-10-28 63 views
1

如果「類」限制未應用於參數,則已知泛型不支持相等性比較。我們如何解決LINQ To Entities的問題?實體框架比較通用

query.Where(p => p.CategoryId == categoryId); //doesn't work 

我看到的解決辦法之前是使用EqualityComparer.Default.Equal,但它不能被轉換爲SQL。

我也試圖手動構建表達:

 var parameterExpression = Expression.Parameter(typeof(T)); 
     var categoryIdPropertyExpression = Expression.Property(parameterExpression, "CategoryId"); 
     var categoryIdExpression = Expression.Constant(categoryId); 
     var equalityExpression = Expression.Equal(categoryIdPropertyExpression, categoryIdExpression); 
     Expression<Func<T, bool>> lambda = Expression.Lambda<Func<T, bool>>(equalityExpression, parameterExpression); 

     query = query.Where(lambda); 

我的T可以是長或爲空。如果T是可爲空的,則此代碼將引發異常,因爲它可以檢查長和Nullable的相等性。

是否有適用於EF的任何變通辦法。

回答

0

當您使用可空類型時,此查詢是否工作?

query.Where(p => 
    (p.CategoryId == null && categoryId == null) 
    || (p.CategoryId.Value == categoryId.Value)); 

原始查詢或多或少產生以下SQL:

SELECT * 
FROM [Table] 
WHERE [CategoryId] = @p0 

我的查詢產生:

SELECT * 
FROM [Table] 
WHERE (([CategoryId] IS NULL) AND (@p0 IS NULL)) OR ([CategoryId] = @p0) 

第一個查詢不返回結果時categoryIdnull,但第二個是。

作爲替代(這是不太可讀,而且也適用),你可以試試這個:

from p in query 
join a in new [] { categoryId } on p.CategoryId equals a 
select p; 

乾杯。

1

,幫助我解決辦法:通過參數標識爲通用和改線

var categoryIdExpression = Expression.Constant(categoryId); 

var categoryIdExpression = Expression.Constant(categoryId, typeof(P));