2012-12-19 113 views
1

它是因爲我已經使用實體框架的同時,和我跳回到與EF 5,但不會此查詢:string.IsNullOrEmpty +實體框架5

SELECT 
    c.OrganizationName as CompanyName, 
    c.OrganizationKey as CompanyId, 
    ISNULL(a.Line1, '') as Line1, 
    ISNULL(a.Line2, '') as Line2, 
    a._CityStateZip as CityStateZip 
FROM Organizations c 
JOIN Addresses a ON c.AddressKey = a.AddressKey 
WHERE c.OrganizationName LIKE @term + '%' 
AND c.IsSuspended = 0 
AND c.IsActive = 1 

相同如:

var results = (from c in adms.Organizations 
       where c.OrganizationName.StartsWith(term) 
       where !c.IsSuspended 
       where c.IsActive 
       select new 
       { 
       CompanyName = c.OrganizationName, 
       CompanyId = c.OrganizationKey, 
       Line1 = (string.IsNullOrEmpty(c.Address.Line1) ? string.Empty : c.Address.Line1), 
       Line2 = (string.IsNullOrEmpty(c.Address.Line2) ? string.Empty : c.Address.Line2), 
       CityStateZip = c.Address._CityStateZip 
       }).ToList(); 

當我運行的LINQ to SQL代碼,我得到以下錯誤:

Could not translate expression 
'Table(Organization).Where(c => c.OrganizationName 
.StartsWith(Invoke(value(System.Func`1[System.String])))) 
.Where(c => Not(c.IsSuspended)) 
.Where(c => c.IsActive) 
.Select(c => new <>f__AnonymousType2`5(
CompanyName = c.OrganizationName, 
CompanyId = c.OrganizationKey, 
Line1 = IIF(IsNullOrEmpty(c.Address.Line1), 
Invoke(value(System.Func`1[System.String])), c.Address.Line1), 
Line2 = IIF(IsNullOrEmpty(c.Address.Line2), 
Invoke(value(System.Func`1[System.String])), c.Address.Line2), 
CityStateZip = c.Address._CityStateZip))' 
into SQL and could not treat it as a local expression. 

難道我完全失去了一些東西,他回覆?我以爲我可以使用LINQ to SQL的string.IsNullOrEmpty。

+0

EF LINQ支持只是很傷心...... LINQ to SQL支持這個(還有更多)。 – usr

回答

6

更換string.Empty""。不幸的是,EF不支持string.Empty

EF LINQ支持一般很糟糕。始終注意這個問題。這是EF造成悲傷的常見原因。

LINQ to SQL在通用語言習語方面沒有問題。

順便說一句,你可以更好地改寫這個好得多c.Address.Line1 ?? ""

+1

這正是我需要的。也感謝提示使用c.Address.Line1 ?? 「」.... ??完全滑了我的腦海! –

+0

謝謝..你救我一天! –

+1

可能是這個回答太舊了。但是用EF6,它也支持string.Empty。 –

1
(string.IsNullOrEmpty(c.Address.Line1) ? string.Empty : c.Address.Line1) 

被翻譯成

IIF(IsNullOrEmpty(c.Address.Line1), Invoke(value(System.Func`1[System.String])), c.Address.Line1) 

所有你正在做的,是設置一個字符串值""如果它是空或""了。

你應該儘量只使用Line1 = c.Address.Line1

+0

Line1 =如果Line1爲null,則c.Address.Line1返回值null。這就是爲什麼我想使用string.IsNullOrEmpty。 –