3

Entity Frameworkを使用してからしばらく経ち、EF 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.

私はここで何かを完全に見逃していますか?string.IsNullOrEmptyをLINQtoSQLで使用できると思いました。

4

2 に答える 2

8

に置き換えstring.Emptyます""。残念ながら、EFはをサポートしていませんstring.Empty

EFLINQのサポートは一般的に非常に悪いです。この問題に常に注意してください。それはEFの悲しみの一般的な原因です。

LINQ to SQLには、一般的な言語のイディオムに問題はありません。

ところで、これをもっとうまく書き直すことができます:c.Address.Line1 ?? ""

于 2012-12-19T19:18:50.337 に答える
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)

あなたがしているのは、文字列値を""nullまたは""すでにの場合に設定することだけです。

あなたはただ使うことを試みるべきですLine1 = c.Address.Line1

于 2012-12-19T19:12:17.940 に答える