我有一个特定的计算字段,我经常想在Linq查询的"选择"字段中返回,例如今年的客户订单总数,以及客户的其他人口统计信息.
public class Customer {
public decimal TotalPurchasesThisYear(MyDataContext db) {
return db.Orders.Where(o => o.CustomerID == ID)
.Sum(o => o.OrderTotalAmt);
}
}
public class SomeReport {
public void GetCustomerInfoBySalesperson(long salespersonID) {
using (var db = new MyDataContext()) {
var q = db.Customers.Where(c => c.SalespersonID == salespersonID)
.Select(c => new { c.Name, c.Address, ThisYearPurchases = c.TotalPurchasesThisYear(db) })
.ToList();
// etc..
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,这不起作用,因为TotalPurchasesThisYear没有SQL翻译.但其中的所有内容都有SQL翻译.我不想直接在查询中包含该代码,因为我在很多地方进行相同的计算.我的直觉告诉我这应该用a来完成,Expression但是我已经玩过了,并且无法找到正确的语法.
帮忙,有人吗?谢谢!
我是Linq的忠实粉丝,我一直非常享受表达树等的力量.但是我发现每当我试图对我的疑问过于聪明时,我在框架中遇到了某些限制:查询可能需要很短的时间内数据库(如通过性能分析器)上运行,结果拿年龄兑现.当发生这种情况时,我知道我太过花哨了,我开始将查询分解成更小,更小的块 - 所以我有一个解决方案,尽管它可能并不总是最优的.
但我想明白:
编辑:根据评论中的要求,这是我在几秒钟内测量在SQL Server上运行的查询示例,但花了将近2分钟来实现.我不会尝试在上下文中解释所有内容; 它就在这里,您可以查看构造并查看我正在谈论的示例:
Expression<Func<Staff, TeacherInfo>> teacherInfo =
st => new TeacherInfo
{
ID = st.ID,
Name = st.FirstName + " " + st.LastName,
Email = st.Email,
Phone = st.TelMobile,
};
var step1 =
currentReportCards.AsExpandable()
.GroupJoin(db.ScholarReportCards,
current =>
new { current.ScholarID, current.AcademicTerm.AcademicYearID },
past => new { past.ScholarID, past.AcademicTerm.AcademicYearID },
(current, past) => new
{
Current = current,
PastCards =
past.Where(
rc =>
rc.AcademicTerm.StartDate <
current.AcademicTerm.StartDate &&
rc.AcademicTerm.Grade == current.AcademicTerm.Grade …Run Code Online (Sandbox Code Playgroud) 给定一个标准的调度信息,例如"2009年6月的第二个星期二"或"2009年7月的最后一个星期五",将这个信息转换为日期的最简单,最有效的公式是什么?
输入:
w =月份,枚举(第1,第2,第3,第4或最后) d =星期几,星期日到星期六m =月,整数y =年,整数编辑(再次) - 本周哪一天开始并不重要; 我想在给定的月份得到d的w实例.因此,2009年6月的第2个星期日是6月14日,尽管技术上属于6月的第3周; 同样,6月的第一个星期日是6月7日,不是空/例外.
我想以编程方式检查是否安装了最新版本的Windows服务.我有:
var ctl = ServiceController.GetServices().Where(s => s.ServiceName == "MyService").FirstOrDefault();
if (ctl != null) {
// now what?
}
Run Code Online (Sandbox Code Playgroud)
我在ServiceController界面上看不到任何告诉我版本号的东西.我该怎么做?
我的ClickOnce应用程序包含一个app.config文件,应用程序根据用户的偏好进行修改.但是,似乎每次我的客户获得应用程序的新版本时,app.config文件都会重置为其原始状态.
有没有办法app.config在ClickOnce更新之间保留文件?
我在C#库中编写了很多代码,我现在需要从Java调用它.
我在SO上建议使用JNA,但是我甚至无法摆脱起跑线; 那里的文件非常粗略.
首先,它似乎只是告诉你如何连接到Native C库,这对我没有好处; 我想连接到我自己的库.代码示例显示:
// This is the standard, stable way of mapping, which supports extensive
// customization and mapping of Java to native types.
public interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary)
Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"),
CLibrary.class);
void printf(String format, Object... args);
}
Run Code Online (Sandbox Code Playgroud)
我想连接到我的库(MyLibrary.dll),并调用MyNamespace.MyClass其C#签名为的静态方法:
public static string HelloWorld(string p)
Run Code Online (Sandbox Code Playgroud)
那么我给出的参数是什么Native.loadLibrary()?
那只是为了"Hello World".如果我想要返回一个对象怎么办?我们说MyClass也有一个静态方法
public static MyClass GetInstance()
Run Code Online (Sandbox Code Playgroud)
我如何使用JNA调用它?我想我必须定义在Java中,在C#相匹配的接口MyClass界面...但它必须是详尽的,即对于每一个公共的成员MyClass,我将不得不宣布在一个方法IMyClass的Java接口?或者我可以省略我不关心的界面?
欢迎任何示例代码!
代码摘录:
var a = Assembly.LoadFile("MyAssembly.dll");
var t = a.GetType("MyNamespace.MyClass", false);
Debug.Assert(t != null); // fails
Run Code Online (Sandbox Code Playgroud)
Assembly.LoadFile()正在加载程序集没有任何问题,但Assembly.GetType()返回null,即使我已经验证MyNamespace.MyClass存在并正确拼写.
任何其他想法为什么会这样?
这是我们在客户网站上遇到的一种相当不愉快的泡菜.客户端有大约100个工作站,我们在其上部署了产品"MyApp"的1.0.0版本.
现在,该产品所做的一件事是加载一个加载项(称之为"MyPlugIn",它首先在中央服务器上查找是否有更新的版本,如果是,则复制该文件在本地,然后它使用Assembly.Load并调用某个已知的接口加载加载项.这已经好几个月了.
然后客户想在某些机器上安装我们产品的v1.0.1(但不是全部).随之而来的是MyPlugIn的新版本.
但随后出现了问题.有一个共享DLL,由MyApp和MyPlugIn引用,称为MyDLL,它有一个方法MyClass.MyMethod.在v1.0.0和v1.0.1之间,MyClass.MyMethod更改了签名(添加了一个参数).现在新版本的MyPlugIn导致v1.0.0客户端应用程序崩溃:
找不到方法:MyClass.MyMethod(System.String)
客户端明确地不希望在所有客户端站点上部署v1.0.1,因为v1.0.1中包含的修复程序仅对少数工作站是必需的,并且不需要将其推广到所有客户端.遗憾的是,我们还没有(还)使用ClickOnce或其他大规模部署实用程序,因此推出v1.0.1将是一项痛苦而且不必要的练习.
有没有办法在MyPlugin中编写代码,以便它能够同样正常工作,无论它是处理MyDLL v1.0.0还是v1.0.1?也许在实际调用它之前,有一些方法可以使用反射来探测预期的接口,看它是否存在?
编辑:我还应该提一下 - 我们有一些非常严格的QA程序.由于QA已正式发布v1.0.1,因此我们不允许对MyApp或MyDLL进行任何更改.我们唯一的行动自由是更改MyPlugin,这是专门为该客户编写的自定义代码.
我有一个非常简单的"Hello World"级应用程序,我在ASP.NET MVC 4/Razor中构建.它在调试模式下工作正常.没有认证; 它直接进入Home/Index.
现在我将它发布到IIS.但是当我通过IIS查看它时,由于某种原因它正在尝试加载"login.aspx"表单.我没有定义任何这样的表单,不是在web.config中,而是在系统中的任何其他地方.无论我在URL中放置什么路径,它总是会重定向到不存在的login.apsx.
为什么?我如何解决它?
编辑:根据评论者的要求,这是我的Web.config:
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
<sectionGroup name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection, DotNetOpenAuth.Core">
<section name="messaging" type="DotNetOpenAuth.Configuration.MessagingElement, DotNetOpenAuth.Core" requirePermission="false" allowLocation="true" />
<section name="reporting" type="DotNetOpenAuth.Configuration.ReportingElement, DotNetOpenAuth.Core" requirePermission="false" allowLocation="true" />
<section name="openid" type="DotNetOpenAuth.Configuration.OpenIdElement, DotNetOpenAuth.OpenId" requirePermission="false" allowLocation="true" />
<section name="oauth" type="DotNetOpenAuth.Configuration.OAuthElement, DotNetOpenAuth.OAuth" requirePermission="false" allowLocation="true" …Run Code Online (Sandbox Code Playgroud) 我找到了一段以下形式的代码:
public static Expression<Func<Invoice, CustomerContact>> GetCustomerContact()
{
return i => new CustomerContact {
FirstName = i.Customer.FirstName,
LastName = i.Customer.LastName,
Email = i.Customer.Email,
TelMobile = i.Customer.TelMobile,
};
}
Run Code Online (Sandbox Code Playgroud)
在代码的其他部分,我想获得相同的轻量级CustomerContact对象,但不是来自Invoice,而是来自Customer本身.因此,显而易见的事情是:
public static Expression<Func<Customer, CustomerContact>> GetCustomerContact()
{
return c => new CustomerContact {
FirstName = c.FirstName,
LastName = c.LastName,
Email = c.Email,
TelMobile = c.TelMobile,
};
}
Run Code Online (Sandbox Code Playgroud)
然后将Expressiontake Invoice作为输入更改为引用此方法,即如下所示:
public static Expression<Func<Invoice, CustomerContact>> GetCustomerContact()
{
return i => GetCustomerContact(i.Customer); // doesn't compile
}
Run Code Online (Sandbox Code Playgroud)
这个的正确语法是什么?
c# ×9
linq ×3
.net ×1
asp.net-mvc ×1
calendar ×1
clickonce ×1
datetime ×1
expression ×1
formula ×1
iis-7 ×1
java ×1
jna ×1
plugins ×1
reflection ×1
versioning ×1