当前位置:  开发笔记 > 编程语言 > 正文

LINQ,在映射中实现接口和异常的实体

如何解决《LINQ,在映射中实现接口和异常的实体》经验,为你挑选了1个好方法。

我正在使用LINQ的存储库模式,有IRepository.DeleteOnSubmit(T Entity).它工作正常,但当我的实体类有接口时,如下所示:

public interface IEntity { int ID {get;set;} }

public partial class MyEntity: IEntity {

    public int ID { 
        get { return this.IDfield; }
        set { this.IDfield=value;  }
    }
}

然后尝试删除这样的实体:

IEntity ie=repository.GetByID(1);
repoitory.DeleteOnSubmit(ie);

throws
成员'IEntity.ID'没有支持的SQL转换.

从DB工作中获取数据,但删除和插入不起作用.如何使用DataContext的接口?


这是:
异常消息:成员'MMRI.DAL.ITag.idContent'没有支持的SQL转换.

码:

var d = repContent.GetAll().Where(x => x.idContent.Equals(idContent));
foreach (var tagConnect in d)    <- error line
{
    repContet.DeleteOnSubmit(tagConnect);

(它从DB获取所有标签,并删除它们)

和堆栈跟踪:

[NotSupportedException: The member 'MMRI.DAL.ITag.idContent' has no supported translation to SQL.]
   System.Data.Linq.SqlClient.Visitor.VisitMember(SqlMember m) +621763
   System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +541
   System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8
   System.Data.Linq.SqlClient.SqlVisitor.VisitBinaryOperator(SqlBinary bo) +18
   System.Data.Linq.SqlClient.Visitor.VisitBinaryOperator(SqlBinary bo) +18
   System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +196
   System.Data.Linq.SqlClient.SqlVisitor.VisitExpression(SqlExpression exp) +8
   System.Data.Linq.SqlClient.SqlVisitor.VisitSelectCore(SqlSelect select) +46
   System.Data.Linq.SqlClient.Visitor.VisitSelect(SqlSelect select) +20
   System.Data.Linq.SqlClient.SqlVisitor.Visit(SqlNode node) +1024
   System.Data.Linq.SqlClient.SqlProvider.BuildQuery( ...

当我尝试装饰部分类时:

[Column(Storage = "_idEvent", DbType = "Int NOT NULL", IsPrimaryKey = true)]
public int idContent
{ get { return this.idEvent; } set { this.idEvent=value; } }

它会抛出错误"无效的列名'idContent'."



1> jahu..:

==在MVC4中使用linq-to-sql时,似乎微软放弃了对接口操作符的支持(或者从未支持过).但是i.ID.Equals(someId),您可以使用代替==操作员.

铸造IQueryableIEnumerable工作,但不应该使用!原因是:IQueryable有时髦的实施IEnumerable.无论你IQueryable通过IEnumerable接口使用什么linq方法都会导致首先执行查询,将所有结果从数据库中提取到内存并最终在数据上运行localy方法(通常这些方法将被转换为SQL并在DB中执行.想象一下,试图从一个包含十亿行的表中获取一行,只获取所有这些行以选择一行(并且通过粗心地转换IQueryableIEnumerable和延迟加载相关数据会变得更糟).

显然Linq使用==带有本地数据接口的运算符(因此只IQueryable受影响)和实体框架(或者我听说过)也没有问题.

推荐阅读
小妖694_807
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有