Исключение IEqualityComparer - PullRequest
1 голос
/ 22 июня 2010

Я использую Entity Framework 4.0 и пытаюсь использовать функцию «Содержит» одного объекта, установленного в моем объекте контекста. для этого я кодировал класс Comparer:

    public class RatingInfoComparer : IEqualityComparer<RatingInfo>
    {           
        public bool Equals(RatingInfo x, RatingInfo y)
        {
            var a = new {x.PlugInID,x.RatingInfoUserIP};
            var b = new {y.PlugInID,y.RatingInfoUserIP};

            if(a.PlugInID == b.PlugInID && a.RatingInfoUserIP.Equals(b.RatingInfoUserIP))
                return true;
            else
                return false;
        }

        public int GetHashCode(RatingInfo obj)
        {
            var a = new { obj.PlugInID, obj.RatingInfoUserIP };

            if (Object.ReferenceEquals(obj, null))
                return 0;
            return a.GetHashCode(); 
        }


    }

когда я пытаюсь использовать компаратор с этим кодом:

    public void SaveRatingInfo2(int plugInId, string userInfo)
    {

        RatingInfo ri = new RatingInfo()
        {
            PlugInID = plugInId,
            RatingInfoUser = userInfo,
            RatingInfoUserIP = "192.168.1.100"
        };

        //This is where i get the execption
        if (!context.RatingInfoes.Contains<RatingInfo>(ri, new RatingInfoComparer()))
        {
            //my Entity Framework context object
            context.RatingInfoes.AddObject(ri);
            context.SaveChanges();
        }
    }

я получаю исключение:

«LINQ to Entities не распознает метод« Boolean Contains [RatingInfo] (System.Linq.IQueryable 1[OlafCMSLibrary.Models.RatingInfo], OlafCMSLibrary.Models.RatingInfo, System.Collections.Generic.IEqualityComparer 1 [OlafCMSLibrary.Models.RatingInfo]) », и его метод нельзя преобразовать в выражение хранилища. «

Поскольку я не очень разбираюсь в linQ и Entity Framework, возможно, я ошибаюсь, используя «var» в функции «GetHashCode» или вообще.

Если моя ошибка вам ясна, скажите мне :) это не остановит мой проект! но мне важно понять, почему простой компаратор не работает.

Спасибо Аарон

1 Ответ

2 голосов
/ 22 июня 2010

LINQ to Entities работает путем преобразования дерева выражений в запросов к объектной модели через интерфейс IQueryable. Это означает, что вы можете поместить в дерево выражений только те вещи, которые понимает LINQ to Entities.

Он не понимает используемый вами метод Contains, поэтому выдает исключение, которое вы видите. Вот список методов, которые он понимает .

В заголовке раздела Set Methods в нем содержится список Contains, использующий элемент в качестве поддерживаемого, но в списке Contains с IEqualityComparer как не поддерживаемый. Вероятно, это связано с тем, что он должен быть в состоянии решить, как преобразовать ваш IEqualityComparer в запрос к объектной модели, что будет сложно. Вы можете делать то, что хотите, используя несколько предложений Where, посмотрите, какие из них поддерживаются далее в документе.

...