【问题标题】:Using LINQ intersect function with a non-primitive type将 LINQ 相交函数与非原始类型一起使用
【发布时间】:2011-05-25 16:33:11
【问题描述】:

我正在使用带有代码优先的实体框架。我有一个正在传递给函数的对象列表,该函数将使用 DatabaseContext 中的 Intersect 函数并传递对象。它不工作。代码如下:

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();

    }

我创建了一个实现 IEqualityComparer 的 ContractComparer 类:

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.IQueryable1[Contract] Intersect[Contract](System.Linq.IQueryable1[Contract], System.Collections.Generic.IEnumerable1[Contract], System.Collections.Generic.IEqualityComparer1[Contract])' 方法,并且该方法无法翻译成商店表达式。

有什么想法吗?谢谢。

【问题讨论】:

    标签: c# linq entity-framework ef-code-first


    【解决方案1】:

    怎么样;

    var contract = dc.Contracts
        .Where(c => selectedContracts.Select(x => x.OID).ToList().Contains(c.OID));
    

    【讨论】:

    • 这只会在条件满足时返回一个布尔值,对吗?我需要实际修改数据库中的行,因此我需要 DatabaseContext 中与 selectedContract 中的合同相匹配的行的集合
    • 好吧,我已经修改了一点
    • 如果 OID 是 Pk,你可能只写 dc.Contracts.Where(c =&gt; selectedContracts.Contains(c))
    • 我尝试了两种方法,但出现以下错误:无法创建“合同”类型的常量值。此上下文仅支持原始类型(“例如 Int32、String 和 Guid”)。 Google 帮不上什么忙,知道这意味着什么吗?
    • ok.. 尝试在输入集合 selectedContracts.Select(x =&gt; x.OID).ToList().Contains.. 上添加 ToList() ?
    【解决方案2】:

    许多人认为,他们可以通过 linq-to-objects 完成的任何事情,也可以通过 linq-to-entities 完成 - 这是不正确的。普遍的例子是尝试使用.ToString().SubString().Intersect()等。

    要在 L2E 中相交实体集,您应该使用.Contains() 方法:

    var contract = from c in db.Contracts
                           where selectedContracts.Contains(c.ContractID)
                           select c;
    

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 2010-10-28
      • 2012-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多