Использование функции пересечения LINQ с не примитивным типом - PullRequest
2 голосов
/ 25 мая 2011

Я использую ENtity Framework с Code First. У меня есть список объектов, которые передаются в функцию, которая будет использовать функцию Intersect из DatabaseContext и передавать объекты. Это не работает. Вот код:

public void BeginProcess(IEnumerable<Contract> selectedContracts)
    {

        DatabaseContext dc= new DatabaseContext();

        var contract = dc.Contracts.Intersect<Contract>(selectedContracts, new ContractComparer());


        foreach (var item in contract)
        {
            item.BatchNumber = 10;
        }
        //odc.Contracts.Intersect(selectedContracts).ToList().ForEach(x=>x.BatchNumber = batchNum);
        odc.SaveChanges();

    }

Я создал класс ContractComparer, который реализует IEqualityComparer:

public class ContractComparer : IEqualityComparer<Contract>
    {

        #region IEqualityComparer<Contract> Members

        public bool Equals(Contract x, Contract y)
        {
            //Check whether the compared objects reference the same data.
            if (Object.ReferenceEquals(x, y)) return true;

            //Check whether any of the compared objects is null.
            if (Object.ReferenceEquals(x, null) || Object.ReferenceEquals(y, null))
                return false;

            return x.OID == y.OID;
        }

        public int GetHashCode(Contract obj)
        {
            return base.GetHashCode();
        }

        #endregion
    }

Я получаю ошибку:

LINQ to Entities не распознает метод 'System.Linq.IQueryable 1[Contract] Intersect[Contract](System.Linq.IQueryable 1 [Contract], System.Collections.Generic.IEnumerable 1[Contract], System.Collections.Generic.IEqualityComparer 1 [Contract])', и этот метод нельзя преобразовать в магазинное выражение.

Есть идеи? Благодарю.

Ответы [ 2 ]

4 голосов
/ 25 мая 2011

Как насчет;

var contract = dc.Contracts
    .Where(c => selectedContracts.Select(x => x.OID).ToList().Contains(c.OID));
0 голосов
/ 27 июля 2013

Многие люди думают, что все, что они могут сделать с помощью linq-to-objects, может быть сделано и linq-to-entity - это неправильно.В распространенных примерах пытаются использовать .ToString(), .SubString(), .Intersect() и т. Д.

Для пересечения наборов сущностей в L2E следует использовать метод .Contains():

var contract = from c in db.Contracts
                       where selectedContracts.Contains(c.ContractID)
                       select c;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...