如果我使用连接,则Include()方法不再有效,例如:
from e in dc.Entities.Include("Properties")
join i in dc.Items on e.ID equals i.Member.ID
where (i.Collection.ID == collectionID)
select e
Run Code Online (Sandbox Code Playgroud)
e.Properties
没有加载
没有连接,Include()可以工作
背风处
我和一位同事为我们的客户设计了一个系统,我们认为我们创造了一个漂亮干净的设计.但是我遇到了一些我们引入的耦合问题.我可以尝试创建一个包含与我们的设计相同的问题的示例设计,但如果您原谅我,我将创建一个设计摘录来支持这个问题.
我们正在开发一种为患者注册某些治疗方案的系统.为了避免链接到图像,我将概念性UML类图描述为ac#样式类定义.
class Discipline {}
class ProtocolKind
{
Discipline;
}
class Protocol
{
ProtocolKind;
ProtocolMedication; //1..*
}
class ProtocolMedication
{
Medicine;
}
class Medicine
{
AdministrationRoute;
}
class AdministrationRoute {}
Run Code Online (Sandbox Code Playgroud)
我将尝试解释一下设计,协议是新治疗的模板.并且协议属于某种类型并且具有需要施用的药物.根据协议,对于相同的药物(以及其他事物),剂量可以不同,因此存储在ProtocolMedication类中.AdministrationRoute是药物的管理方式,与协议管理分开创建/更新.
我发现以下地方违反了得墨忒耳法则:
例如,在ProtocolMedication的业务逻辑中,存在依赖于药物的AdministrationRoute.Soluble属性的规则.代码将成为
if (!Medicine.AdministrationRoute.Soluble)
{
//validate constrains on fields
}
Run Code Online (Sandbox Code Playgroud)
列出某个学科中所有协议的方法将写成:
public IQueryable<Protocol> ListQueryable(Discipline discipline)
{
return ListQueryable().Where(p => (p.Kind.Discipline.Id == discipline.Id)); // Entity Frameworks needs you to compare the Id...
}
Run Code Online (Sandbox Code Playgroud)
我们使用ASP.NET(没有MVC)作为我们系统的接口,在我看来这个层目前有最严重的违规行为.gridview的数据绑定(必须显示协议的Discipline的列必须绑定到Kind.Discipline.Name),这是字符串,因此没有编译时错误.
<asp:TemplateField HeaderText="Discipline" SortExpression="Kind.Discipline.Name">
<ItemTemplate>
<%# Eval("Kind.Discipline.Name")%>
</ItemTemplate>
</asp:TemplateField>
Run Code Online (Sandbox Code Playgroud)
所以我认为实际的问题可能是,什么时候可以将其视为Demeter的建议,以及可以采取哪些措施来解决违反Demeter法的问题?
我对自己有一些想法,但我会将它们作为答案发布,以便他们可以单独评论和投票.(我不确定这是不是这样做的方法,如果没有,我会删除我的答案并将其添加到问题中).
我想在执行之前重写LINQ表达式的某些部分.而且我在将重写器注入正确的位置时遇到了问题(实际上是这样).
查看实体框架源(在反射器中)它最终归结为IQueryProvider.Execute
EF中的哪一个通过ObjectContext
提供internal IQueryProvider Provider { get; }
属性与表达式耦合.
所以我创建了一个包装器类(实现IQueryProvider
),在调用Execute时执行Expression重写,然后将其传递给原始的Provider.
问题是,背后的领域Provider
是private ObjectQueryProvider _queryProvider;
.这ObjectQueryProvider
是一个内部密封类,这意味着不可能创建一个提供添加重写的子类.
因此,由于非常紧密耦合的ObjectContext,这种方法让我陷入了死胡同.
如何解决这个问题呢?我看错了方向吗?有没有办法让自己注意到这个ObjectQueryProvider
?
更新:虽然提供的解决方案在您使用存储库模式"包装"ObjectContext时都能正常工作,但是允许直接使用ObjectContext生成的子类的解决方案将更可取.因此保持与Dynamic Data脚手架兼容.
我正在尝试使用graphviz对某个流进行建模,我无法弄清楚如何对下面的图进行建模以共享同一个水平中心
digraph exmp {
A -> B -> C -> D
C -> E [constraint=false]
A -> C [style="dotted", constraint=false]
A -> D [style="dotted", constraint=false]
B -> D [constraint=false]
D -> A [style="dashed", constraint=false]
C -> A [style="dashed", constraint=false]
subgraph cluster_hackToSinkIt { E -> F }
{ rank="sink" E F }
}
Run Code Online (Sandbox Code Playgroud)
这导致以下图表:
我的问题是,我怎样才能将E - > F定位在D下,这就是在同一列中?
我想合并以下表达式:
// example class
class Order
{
List<OrderLine> Lines
}
class OrderLine { }
Expression<Func<Order, List<OrderLine>>> selectOrderLines = o => o.Lines;
Expression<Func<List<OrderLine>, Boolean>> validateOrderLines = lines => lines.Count > 0;
// now combine those to
Expression<Func<Order, Boolean>> validateOrder;
Run Code Online (Sandbox Code Playgroud)
我使用selectOrderLines上的调用并将结果提供给validateOrderLines,但是因为我在Entity Framework中使用这些表达式,我必须实际创建一个干净的表达式,它应该代表:
Expression<Func<Order, Boolean>> validateOrder = o => o.Lines.Count > 0;
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我正在使用T4为LINQ to Entities实体生成存储库.
存储库包含(除其他外)适合于分页的List方法.支持和不支持的方法的文档没有提到它,但是你不能Skip
在无序上"调用" IQueryable
.它会引发以下异常:
System.NotSupportedException:方法'Skip'仅支持LINQ to Entities中的排序输入.必须在方法'Skip'之前调用'OrderBy'方法.
我通过允许通过部分方法定义默认排序来解决它.但是我在检查表达式树是否确实包含一个问题时遇到了问题OrderBy
.
我已将问题减少到尽可能少的代码:
public partial class Repository
{
partial void ProvideDefaultSorting(ref IQueryable<Category> currentQuery);
public IQueryable<Category> List(int startIndex, int count)
{
IQueryable<Category> query = List();
ProvideDefaultSorting(ref query);
if (!IsSorted(query))
{
query = query.OrderBy(c => c.CategoryID);
}
return query.Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression, int startIndex, int count)
{
return List(sortExpression).Skip(startIndex).Take(count);
}
public IQueryable<Category> List(string sortExpression)
{
return AddSortingToTheExpressionTree(List(), sortExpression);
}
public IQueryable<Category> List()
{
NorthwindEntities ent = …
Run Code Online (Sandbox Code Playgroud) 我遇到边缘相互重叠的问题.在我之前关于如何强制节点在同一列中的问题中,找到了如何将节点强制到一列,但这会导致出现一些其他问题.
digraph exmp {
A -> B -> C -> D -> E
C -> F [constraint=false]
A -> C [style="dotted", constraint=false]
A -> D [style="dotted", constraint=false]
B -> D [constraint=false]
D -> A [style="dashed", constraint=false]
C -> A [style="dashed", constraint=false]
E -> F [style="invis"]
F -> G
E -> C [constraint="false"]
}
Run Code Online (Sandbox Code Playgroud)
呈现给:
alt text http://img98.imageshack.us/img98/8324/wrong2.gif
我的问题是E - > C和C - > F的边缘在节点C的同一点开始/结束,虚线和虚线边缘都在节点的右侧.
我怎么能告诉特定边缘到节点的右侧?
我使用Indy 9和Delphi 5.在我的应用程序中,我想通过UDP与网络设备通信.所以我使用UDPServer comp.在一个派生自TThread的类中.当我写类似于以下代码时,CPU使用率是100%.
在线程中:
while not terminated do begin
if GetMessage(Msg, 0, 0, 0) then begin
if Msg.message = WM_UDPMSG then
Break
else
DispatchMessage(Msg);
end;
end;
Run Code Online (Sandbox Code Playgroud)
和OnUDPRead事件:
try
// Processing the data here
except
PostThreadMessage(ThreadId, WM_UDPMSG, 0, 0);
end;
Run Code Online (Sandbox Code Playgroud)
当我在while-do循环或OnUDPRead事件中使用Sleep函数时,没有任何变化.CPU使用率仍为100%.
我的线程优先级是正常.
我怎样才能解决我的问题?
桌面应用程序如何与Vista/Windows2008/Windows7下的Windows服务进行通信?应用程序需要向服务发送小字符串并接收字符串响应.两者都是用Delphi 2009编写的.(请提供示例代码)
我想从Java环境的上下文启动.NET应用程序(与Mono兼容).
我的猜测是,我必须以某种方式弄清楚是否安装了mono,找到位置并使用.NET应用程序路径作为参数启动它.
但是这样做的有效方法是什么?或者,还有更好的方法?
也许我应该澄清一下上下文:Java部分在一个可能有限的交互环境中作为插件运行,所以我更愿意找到一种方法,而不需要配置文件或用户界面.
我想开发一个特定的插件/扩展,它需要在eclipse中运行并且必须与另一个(java)插件集成,但它必须从.NET程序集中收集数据(使用mono的cecil).
所以我的问题是如何在Java代码和.NET之间创建这种关系?我知道我可以使用mono来运行.net应用程序,例如Linux,但我有2个问题,我想Java插件启动.NET应用程序,第二个问题是如何让Java插件进行某些调用到.NET应用程序.
对于这两个应用程序之间的这种通信,我希望独立于平台,以便相同的二进制文件可以在Windows,OSX和Linux中运行.另一个可能重要的事实是,调用的结果可能包含非常大的对象集合.
或者也许更好/可能在java中托管.NET程序集并直接调用它?
更新:我认为理想的答案可以解决以下问题:
我想了解垃圾收集器在什么情况下会通知您清除软引用。文档清楚地表明它在可能发生 OOM 时发生,但是如果您完全丢弃引用,GC 会出现并收集 SoftReference 可能会注意到不存在其他强/软引用并清除内部引用值。
ReferenceQueue<Object> cleared = new ReferenceQueue<>();
Object X = new Object();
SoftReference<Object> Xs = new SoftReference<>(X, cleared);
Thread.sleep(10);
X = null;
Xs = null;
System.GC();
Thread.sleep(100);
Reference ref;
while ((ref = cleared.poll()) != null) {
System.err.println(ref);
}
Run Code Online (Sandbox Code Playgroud)
那么关于这个队列的规则记录在哪里?一定有比我问的更多的极端情况,所以也许这个问题必须扩大一点。