5

objectDaos の全員が継承する entityDao があります。私は Dynamic Linq を使用しており、いくつかの一般的なクエリを機能させようとしています。

EntityDao の汎用メソッドに次のコードがあります。

public abstract class EntityDao<ImplementationType> where ImplementationType : Entity
{ 
    public ImplementationType getOneByValueOfProperty(string getProperty, object getValue){
    ImplementationType entity = null;
    if (getProperty != null && getValue != null) 
    {
        LCFDataContext lcfdatacontext = new LCFDataContext(); 
         //Generic LINQ Query Here
         entity = lcfdatacontext.GetTable<ImplementationType>().Where(getProperty + " =@0", getValue).FirstOrDefault();
         //.Where(getProperty & "==" & CStr(getValue))
     }

 //lcfdatacontext.SubmitChanges()
 //lcfdatacontext.Dispose()

return entity;
}

        次に、単体テストで次のメソッド呼び出しを行います (すべての objectDaos は entityDao を継承します)。

[Test]
public void getOneByValueOfProperty()
{
    Accomplishment result = accomplishmentDao.getOneByValueOfProperty
        ("AccomplishmentType.Name", "Publication");

    Assert.IsNotNull(result);
}

上記合格(AccomplishmentTypeは達成度に関係あり)

Accomplishment result = accomplishmentDao.getOneByValueOfProperty("Description", "Can you hear me now?");
Accomplishment result = accomplishmentDao.getOneByValueOfProperty("LocalId", 4);

上記の両方が機能します。でも、

 Accomplishment result = accomplishmentDao.getOneByValueOfProperty
    ("Id", New Guid("95457751-97d9-44b5-8f80-59fc2d170a4c"));

動作せず、次のように言います。

Operator '=' incompatible with operand types 'Guid' and 'Guid

なぜこうなった?ガイドは比較できませんか?私も試し==ましたが、同じエラーです。さらに紛らわしいのは、私が見た Dynamic Linq のすべての例は、パラメーター化された where 述語を使用するか、コメントアウトしたものを使用するかに関係なく、単純に文字列を使用していることです。

//.Where(getProperty & "==" & CStr(getValue))

Cstr の有無にかかわらず、多くのデータ型はこの形式では機能しません。getValue をオブジェクトではなく文字列に設定しようとしましたが、別のエラーが発生します (複数単語の文字列は最初の単語の後に比較を停止するなど)。

これを GUID や任意のデータ型で機能させるには何が欠けていますか? 理想的には、オブジェクトの代わりに (他のすべての動的 LINQ の例で見たように) getValue に文字列を渡すだけで、列のデータ型に関係なく機能するようにしたいと考えています。

4

2 に答える 2

6

私はこれを理解しました.Dynamic LINQは最初はGUIDの比較をサポートしていません(とてもばかげています!)。このちょっとした情報を見つけました: https://connect.microsoft.com/VisualStudio/feedback/details/333262/system-linq-dynamic-throws-an-error-when-using-guid-equality-in-where-clause

Dynamics.cs を編集して、IEqualitySignatures インターフェイスを次のように置き換えます。

interface IEqualitySignatures : IRelationalSignatures
{
    void F(bool x, bool y);
    void F(bool? x, bool? y);
    void F(Guid x, Guid y);
    void F(Guid? x, Guid? y);
}

今私の getOneByValueOfProperty は常に動作します!

于 2010-04-09T18:16:32.143 に答える
0

Guidの場合、これは機能するはずです。

.Where(getProperty + ".Equals(@0)", getValue);

(パラメーターgetValueはGuid型である必要があることに注意してください)

于 2012-12-18T15:33:46.373 に答える