kmp*_*kmp 5 .net c# entity-framework poco entity-framework-4.3
我首先使用Entity Framework 4.3,POCO,数据库,我收到以下错误:
内部.NET Framework数据提供程序错误1025.
问题: 我认为我的查询表达了我的意图,但我似乎遇到了这个错误,所以我想知道是否有人知道如何以不同的方式构建我的查询来解决这个错误?
这是场景......
我有一个SQL Server 2008数据库,有2个表--A和B:
一个
乙
然后我像这样定义上下文:
public class DatabaseContext : DbContext
{
public DatabaseContext(string name)
: base(name)
{
Configuration.AutoDetectChangesEnabled = false;
As = Set<A>();
Bs = Set<B>();
}
public DbSet<A> As { get; private set; }
public DbSet<B> Bs { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)
实体类如下:
public class A
{
public int AId { get; set; }
public string AName { get; set; }
public virtual ICollection<B> Bs { get; private set; }
public void AddB(B b)
{
if (b == null)
{
throw new ArgumentNullException("b");
}
if (Bs == null)
{
Bs = new List<B>();
}
if (!Bs.Contains(b))
{
Bs.Add(b);
}
b.A = this;
}
}
public class B
{
public int BId { get; set; }
public A A { get; set; }
public string SomeName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
现在查询...
我想要的是所有的As,其中每个"B SomeName"都在提供的名称列表中,所以我这样做:
var names = new[] {"Name1", "Name2"};
var ctx = new DatabaseContext("EFPlayingEntities");
var res = ctx.As.Where(a => a.Bs.Select(b => b.SomeName).All(names.Contains));
// Here I evaluate the query and I get:
// Internal .NET Framework Data Provider error 1025.
Console.WriteLine(res.Count());
Run Code Online (Sandbox Code Playgroud)
要明确我的意思,如果表数据如下所示:
AId,AName
1,A1
2,A2
3,A3
4,A4
BId,SomeName,AId
1,Name1,1
2,Name2,1
3,Name1,2
4,Name1,3
5,Name3,3
6,Name1,4
7,Name2,4
Run Code Online (Sandbox Code Playgroud)
我希望能够回到A1,A2和A4(所以上面的计数将返回3).
这种情况发生的原因很微妙.
Queryable.All需要被召唤Expression.传入方法'reference'会创建一个委托,然后Enumerable.All成为候选而不是预期Queryable.All.
这就是您作为答案发布的解决方案正常工作的原因.
编辑
因此,如果您将此语句写为此语句,它将毫无例外地起作用:
var res = ctx.As.Where(
a => a.Bs.Select(b => b.SomeName).All(b => names.Contains(b)));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6149 次 |
| 最近记录: |