Alw*_*wyn 6 linq query-expressions fetchxml dynamics-crm-2011
我们发现Linq for CRM 2011非常糟糕 - 它似乎没有在其上执行任何QA.作为如何严重破提供商的指示器是像.凡(X => X =="B")的查询工作,但此.凡(X =>"B" == X)可能不依赖于像前述一些条件加入声明.我实际上不得不重写查询提供程序的一部分,并享受我放在一起的废话更好的运气.
然而,这还不能继续,还有其他问题,我没有为MS工作而付钱,所以我正在寻找其他选择.这两个问题出现在QueryExpression&FetchXml中,如下所示:http://msdn.microsoft.com/en-us/library/gg334607.aspx
任何人都可以给我一个诚实的,现实生活中使用QueryExpression与FetchXml的利弊吗?我想知道他们在性能,开发速度,稳健性和灵活性方面的比较.
Pet*_*eed 11
为了建立Anwar关于LINQ vs. FetchXml的优秀答案,我将添加我从不使用QueryExpression
.为什么?
LINQ:查询是使用标准语言构建的,但内部使用QueryExpression,因此仅限于QueryExpression的功能.
QueryExpression:查询构建为对象模型.支持FetchXML中的所有功能,但聚合和分组除外.
因此,查询功率比FetchXml
没有高级查找代码生成更糟糕,它提供与LINQ提供程序相同的功能,同时提供完全非标准的查询接口(与LINQ不同).
对于LINQ(非)功能,LINQ提供程序的局限性显而易见,我认为相当好,记录在案..Where(x => "b" == x)
例如,您的代码段违反了where
条款限制:
其中:子句的左侧必须是属性名称,子句的右侧必须是值.您不能将左侧设置为常量.该子句的两个边都不能是常量.
不捍卫微软:他们需要在LINQ提供商专业级之前在LINQ提供商(阅读:直接到SQL提供商)上投入大量工作,但是,嘿,至少他们有一个很好的免责声明.
Anw*_*war 10
在我看来,我通常会根据要求选择Linq或FetchXml.
对于Linq:如果是早期限制,我喜欢使用Linq,因为它是强类型的,它对开发速度有很大帮助,但如上所述,它有它的缺点.
对于FetchXML:我真的很喜欢使用这个神奇的声明:
EntityCollection result = _serviceProxy.RetrieveMultiple(new FetchExpression(fetch2));
foreach (var c in result.Entities)
{
System.Console.WriteLine(c.Attributes["name"]);
}
Run Code Online (Sandbox Code Playgroud)
为什么?因为除了聚合和分组之外,它与使用QueryExpression非常相似.我唯一不喜欢FetxhXML的是它很难构建,不像Linq.
为了构建FetchXML查询,我必须打开Advanced-Find然后添加列然后放入我的标准等等,最后我下载并将其复制到我的代码中,依此类推.
最后,FetchXML在其他方面的限制最少.
关于性能,我尝试使用StopWatch在Linq和FetchXML之间进行基准测试,结果是FetchXML比Linq更快.
我被客户专门要求使用查询表达式模型,所以为了让我的生活更轻松,我已经向IOrganizationService添加了很多扩展方法.示例包括:
public static List<T> GetEntities<T>(
this IOrganizationService service,
params object[] columnNameAndValuePairs
) where T : Entity
Run Code Online (Sandbox Code Playgroud)
它将params object []和T实体类型转换为查询表达式,并自动将结果返回给实体列表.所以使用它是这样的:
foreach(var c in service.GetEntities<Contact>("lastname", "Doe", "firstname", "Smith"))
{
...
}
Run Code Online (Sandbox Code Playgroud)
我也经常使用这个:
public static T GetFirstOrDefault<T>(
this IOrganizationService service,
params object[] columnNameAndValuePairs
) where T : Entity
var c = service.GetFirstOrDefault<Contact>("owner", id);
Run Code Online (Sandbox Code Playgroud)
这些类型的扩展方法使得查询表达式的使用变得更加容易,为您提供了更多LINQ类型的样式,而没有容易陷入的奇怪的linq限制陷阱.
归档时间: |
|
查看次数: |
10126 次 |
最近记录: |