小编Dav*_*man的帖子

Linq-to-entities - Include()方法未加载

如果我使用连接,则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()可以工作

背风处

linq entity-framework

46
推荐指数
2
解决办法
5万
查看次数

如何解决违反德米特法的行为?

我和一位同事为我们的客户设计了一个系统,我们认为我们创造了一个漂亮干净的设计.但是我遇到了一些我们引入的耦合问题.我可以尝试创建一个包含与我们的设计相同的问题的示例设计,但如果您原谅我,我将创建一个设计摘录来支持这个问题.

我们正在开发一种为患者注册某些治疗方案的系统.为了避免链接到图像,我将概念性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是药物的管理方式,与协议管理分开创建/更新.

我发现以下地方违反了得墨忒耳法则:

违反了得墨忒耳法

在BLL里面

例如,在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法的问题?

我对自己有一些想法,但我会将它们作为答案发布,以便他们可以单独评论和投票.(我不确定这是不是这样做的方法,如果没有,我会删除我的答案并将其添加到问题中).

language-agnostic design-patterns coupling law-of-demeter

36
推荐指数
3
解决办法
2万
查看次数

如何在执行之前将Entity Framework包装起来拦截LINQ表达式?

我想在执行之前重写LINQ表达式的某些部分.而且我在将重写器注入正确的位置时遇到了问题(实际上是这样).

查看实体框架源(在反射器中)它最终归结为IQueryProvider.ExecuteEF中的哪一个通过ObjectContext提供internal IQueryProvider Provider { get; }属性与表达式耦合.

所以我创建了一个包装器类(实现IQueryProvider),在调用Execute时执行Expression重写,然后将其传递给原始的Provider.

问题是,背后的领域Providerprivate ObjectQueryProvider _queryProvider;.这ObjectQueryProvider 是一个内部密封类,这意味着不可能创建一个提供添加重写的子类.

因此,由于非常紧密耦合的ObjectContext,这种方法让我陷入了死胡同.

如何解决这个问题呢?我看错了方向吗?有没有办法让自己注意到这个ObjectQueryProvider

更新:虽然提供的解决方案在您使用存储库模式"包装"ObjectContext时都能正常工作,但是允许直接使用ObjectContext生成的子类的解决方案将更可取.因此保持与Dynamic Data脚手架兼容.

c# linq entity-framework expression-trees

24
推荐指数
2
解决办法
1万
查看次数

如何在graphviz中强制同一列中的所有节点?

我正在尝试使用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下,这就是在同一列中?

graph dot graphviz

19
推荐指数
1
解决办法
1万
查看次数

如何在没有调用的情况下合并两个C#Lambda表达式?

我想合并以下表达式:

// 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)

我怎样才能做到这一点?

c# lambda linq-to-entities entity-framework

12
推荐指数
1
解决办法
8905
查看次数

如何检查ObjectQuery <T>表达式树中是否存在OrderBy

我正在使用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)

c# linq generics linq-to-entities code-generation

6
推荐指数
1
解决办法
6580
查看次数

如何在graphviz中强制边缘的位置?

我遇到边缘相互重叠的问题.在我之前关于如何强制节点在同一列中的问题中,找到了如何将节点强制到一列,但这会导致出现一些其他问题.

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的同一点开始/结束,虚线和虚线边缘都在节点的右侧.

我怎么能告诉特定边缘到节点的右侧?

graph dot graphviz

6
推荐指数
1
解决办法
5977
查看次数

Delphi中100%的CPU使用率

我使用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%.

我的线程优先级是正常.

我怎样才能解决我的问题?

delphi multithreading udp

5
推荐指数
1
解决办法
3453
查看次数

Delphi 2009:如何在Vista下的Windows服务和桌面应用程序之间进行通信?

桌面应用程序如何与Vista/Windows2008/Windows7下的Windows服务进行通信?应用程序需要向服务发送小字符串并接收字符串响应.两者都是用Delphi 2009编写的.(请提供示例代码)

delphi windows-services ipc delphi-2009 windows-vista

5
推荐指数
2
解决办法
8074
查看次数

如何在Linux,Mac和Windows上从Java启动.NET应用程序?

我想从Java环境的上下文启动.NET应用程序(与Mono兼容).

我的猜测是,我必须以某种方式弄清楚是否安装了mono,找到位置并使用.NET应用程序路径作为参数启动它.

但是这样做的有效方法是什么?或者,还有更好的方法?

也许我应该澄清一下上下文:Java部分在一个可能有限的交互环境中作为插件运行,所以我更愿意找到一种方法,而不需要配置文件或用户界面.

.net java mono cross-platform

5
推荐指数
1
解决办法
863
查看次数

我如何在.NET和Java之间创建跨平台进程间通信?

我想开发一个特定的插件/扩展,它需要在eclipse中运行并且必须与另一个(java)插件集成,但它必须从.NET程序集中收集数据(使用mono的cecil).

所以我的问题是如何在Java代码和.NET之间创建这种关系?我知道我可以使用mono来运行.net应用程序,例如Linux,但我有2个问题,我想Java插件启动.NET应用程序,第二个问题是如何让Java插件进行某些调用到.NET应用程序.

对于这两个应用程序之间的这种通信,我希望独立于平台,以便相同的二进制文件可以在Windows,OSX和Linux中运行.另一个可能重要的事实是,调用的结果可能包含非常大的对象集合.

或者也许更好/可能在java中托管.NET程序集并直接调用它?

更新:我认为理想的答案可以解决以下问题:

  • 如何从Java端启动/调用.NET程序集/应用程序.(跨平台)
  • 如何与.NET程序集通信
  • 这些选择对可修改性有何影响

c# java mono cross-platform ipc

4
推荐指数
1
解决办法
1489
查看次数

当您丢弃对 SoftReference 的引用时,它的清除仍会放在 ReferenceQueue 上吗?

我想了解垃圾收集器在什么情况下会通知您清除软引用。文档清楚地表明它在可能发生 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)

那么关于这个队列的规则记录在哪里?一定有比我问的更多的极端情况,所以也许这个问题必须扩大一点。

java garbage-collection soft-references java-memory-model

3
推荐指数
1
解决办法
99
查看次数