Динамическая справка Linq, различные ошибки в зависимости от объекта передали как параметр?

У меня есть entityDao, который является inherbited каждым из моих objectDaos. Я использую Динамический 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

Почему это происходит? Гуид не может быть сравнен? Я попробовал == также, но та же ошибка. То, что является даже moreso сбивающее с толку, - то, что каждый пример Динамического Linq, я видел просто строки использований, ли с помощью параметризованного, где предикат или этот я прокомментировал:

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

С или без Cstr, много типов данных не работают с этим форматом. Я пытался установить getValue на строку вместо объекта также, но затем я просто добираюсь, различные ошибки (такие как строка многословная остановил бы сравнение после первого слова).

Что я пропускаю для создания этой работы с GUID и/или каким-либо типом данных? Идеально я хотел бы смочь просто передать в строке для getValue (поскольку я видел любой динамический пример LINQ) вместо объекта, и имейте его работа независимо от типа данных столбца.

5
задан AxelEckenberger 8 April 2010 в 21:18
поделиться

1 ответ

Хорошо, я понял это, 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 работает все время!

6
ответ дан 14 December 2019 в 13:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: