我有一个L2E查询返回一些包含重复对象的数据.我需要删除那些重复的对象.基本上我应该假设如果他们的ID是相同的,那么对象是重复的.我试过了q.Distinct(),但仍然返回了重复的对象.然后我尝试实现自己的IEqualityComparer并将其传递给Distinct()方法.该方法失败,并带有以下文字:
LINQ to Entities无法识别方法'System.Linq.IQueryable
1[DAL.MyDOClass] Distinct[MyDOClass](System.Linq.IQueryable1 [DAL.MyDOClass],System.Collections.Generic.IEqualityComparer`1 [DAL.MyDOClass])'方法,并且此方法无法转换为商店表达式.
这是EqualityComparer的实现:
internal class MyDOClassComparer: EqualityComparer<MyDOClass>
{
public override bool Equals(MyDOClass x, MyDOClass y)
{
return x.Id == y.Id;
}
public override int GetHashCode(MyDOClass obj)
{
return obj == null ? 0 : obj.Id;
}
}
Run Code Online (Sandbox Code Playgroud)
那我该怎么写自己的IEqualityComparer呢?
我首先使用Entity Framework 4.1代码时收到此错误.我找不到任何确切使用的来源.
Unable to load the specified metadata resource.
<add name="DataContext" connectionString="metadata=res://*/GrassrootsHoopsDataContext.csdl|res://*/GrassrootsHoopsDataContext.ssdl|res://*/GrassrootsHoopsDataContext.msl;provider=System.Data.SqlClient;provider connection string="Data Source=myserver.com;Initial Catalog=MyDataBase;Persist Security Info=True;User ID=username;Password=password"" providerName="System.Data.EntityClient" />
Run Code Online (Sandbox Code Playgroud) entity-framework connection-string ef-code-first entity-framework-4.1
我正在使用标准的MVC3 Razor视图和不显眼的Javascript验证,@Html.ValidationSummary用于在表单的顶部显示它们.如果标准验证(类似的东西[Required])通过,我会运行一些非常自定义的客户端验证,当用户点击提交按钮时会激活该验证.(验证查看了许多表单元素,以确保已经检查了它们的正确集合等,因此它不像仅为单个字段创建新的自定义验证器那么简单).
我希望我在那里构建的可能错误显示在ValidationSummary列表中,但我无法弄清楚如何让错误消息出现在那里.
请看这行代码.这是一个存储过程的调用,它返回一个ObjectResult<long?>.为了提取长值,我添加了Select:
dbContext.FindCoursesWithKeywords(keywords).Select(l => l.Value);
Run Code Online (Sandbox Code Playgroud)
基于intellisense,这个Select返回IEnumerable<long>.
我不确定我是否在某处读过它或者只是习惯了这个假设 - 我一直认为当EF API返回IEnumerable(而不是IQueryable)时,这意味着结果已经实现.意味着他们已从数据库中撤出.
我今天发现我错了(或者这可能是个错误?).我一直收到错误
"不允许新事务,因为会话中还有其他线程在运行"
基本上,此错误告诉您在db阅读器仍在读取记录时尝试保存更改.
最终我通过(我认为是一个长镜头)解决了这个问题并增加ToArray()了实现IEnumerable<long>......
那么 - 底线 - 我应该期望IEnumerableEF的结果包含尚未实现的结果吗?如果是,那么有没有办法知道一个IEnumerable是否已实现?
如果这是'duhhh'问题之一,感谢并道歉...... :)
将存储过程导入我的datamodel后,项目停止编译.
它一直给我错误:
The best overloaded method match for
'System.Data.Entity.Core.Objects.ObjectContext.ExecuteFunction<TicketDataModel.sp_get_orphanjobgrades1_Result>
(string, params System.Data.Entity.Core.Objects.ObjectParameter[])'
has some invalid arguments C:\Users\nikolaev\Documents\MySoft\TicketManager-06 11 2013\TicketManager\TicketDataModel\TicketDataModel\TicketEntities.Context.cs 105 20 TicketDataModel
Run Code Online (Sandbox Code Playgroud)
和
`Argument 3: cannot convert from 'System.Data.Objects.ObjectParameter' to
'System.Data.Entity.Core.Objects.ObjectParameter'
C:\Users\nikolaev\Documents\MySoft\TicketManager-06 11 2013\TicketManager\TicketDataModel\TicketDataModel\TicketEntities.Context.cs 79 143 TicketDataModel`
Run Code Online (Sandbox Code Playgroud)
代码context.cs如下:
public virtual ObjectResult<sp_get_orphanjobgrades1_Result> sp_get_orphanjobgrades1(Nullable<System.DateTime> start_date, Nullable<System.DateTime> end_date)
{
var start_dateParameter = start_date.HasValue ?
new ObjectParameter("start_date", start_date) :
new ObjectParameter("start_date", typeof(System.DateTime));
var end_dateParameter = end_date.HasValue ?
new ObjectParameter("end_date", end_date) :
new ObjectParameter("end_date", typeof(System.DateTime));
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<sp_get_orphanjobgrades1_Result>("sp_get_orphanjobgrades1", start_dateParameter, end_dateParameter);
}
Run Code Online (Sandbox Code Playgroud)
我读到这可能是因为EF 6并且需要为VS 2012下载VS …
我的存储库在UnitOfWork模型中工作; 所有操作,无论是检索还是持久性,都必须在IDisposable UnitOfWork令牌对象的范围内执行,后者在后面与Session执行请求的工作相关联.所以,基本模式是:
using (var uow = repo.BeginUnitOfWork())
{
try
{
//DB operations here; all repo methods require passing in uow.
...
repo.CommitUnitOfWork(uow);
}
catch(Exception)
{
repo.RollbackUnitOfWork(uow);
throw;
}
}
Run Code Online (Sandbox Code Playgroud)
我还实现了一些包装器方法,允许您指定将在此框架中执行的lambda或委托,从而减少每次都需要实现所有这些脚手架的需要.
我遇到的问题是使用这个模型,代码必须"知道"用户需要什么,并NHUtil.Initialize()在内部使用它来急切加载它UnitOfWork.一旦UOW被放置在使用块的末尾,与any关联的Session PersistentBags就会关闭,因此无法对它们进行评估.由于急切加载所有事情并不总是可行的,并且有点破坏了延迟加载ORM的目的,我正在实现一种Attach()方法.
这是问题; 在没有内置ISession.Attach()方法的情况下,我看到有三种方法建议将对象与新的Session相关联.完成工作的最佳做法是哪一项?
A:
if(!Session.Contains(domainObject))
Session.Update(domainObject);
Run Code Online (Sandbox Code Playgroud)
B:
Session.Merge(domainObject);
Run Code Online (Sandbox Code Playgroud)
C:
Session.Lock(domainObject, LockMode.None);
Run Code Online (Sandbox Code Playgroud) 如何PluralizingTableNameConvention仅针对单个表/ DbSet 切换此约定?至于我可以告诉大家,我只能做到这一切DbSets对于一个给定DbContext
如果我有.tt模板,我可以使用entity.Name来写出实体的名称,例如:
foreach (EntityType entity in ItemCollection.GetItems<EntityType>().OrderBy(e => e.Name))
{;
WriteLine(entity.Name);
}
Run Code Online (Sandbox Code Playgroud)
使用正常转换或T4,如何写出实体集的实际名称?(例如,对于Person,它可能是人物 - 但也许我将其更改为设计师中的People,所以我想要那样做).
谢谢!
理查德
我试图使用扩展方法的强类型视图
<% using (Html.BeginForm()) { %>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>MyUsageViewModel</legend>
<div class="editor-label">
<%= Html.LabelFor(model => model.test) %>
</div>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
无法从用法中推断出方法'System.Web.Mvc.Html.LabelExtensions.LabelFor(System.Web.Mvc.HtmlHelper,System.Linq.Expressions.Expression>)'的类型参数.尝试显式指定类型参数.
帮助将不胜感激
我正在尝试做一些应该相对简单的事情,但我只是不知道如何构建它.
我有一个Generated Entity,我想通过添加Linq Where语句来覆盖它.
以下是Context的部分内容:
public partial class MyEntities: DbContext
{
public MyEntities()
: base("name=MyEntities")
{
}
public DbSet<Assignee> Assignees { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我创建了MyEntities的新部分并尝试了以下内容
public override DbSet<Assignee> Assignees
{
get
{
return this.Assignees.Where(z => z.IsActive == true);
}
set;
}
Run Code Online (Sandbox Code Playgroud)
但这会引发歧义错误(很明显).
我怎么能做到这一点?
谢谢
c# ×5
css ×1
distinct ×1
entity ×1
frameworks ×1
ienumerable ×1
iqueryable ×1
nhibernate ×1
t4 ×1