小编Sha*_*ica的帖子

如何在Linq查询的选择列表中抽象字段?

我有一个特定的计算字段,我经常想在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但是我已经玩过了,并且无法找到正确的语法.

帮忙,有人吗?谢谢!

c# linq linq-to-entities entity-framework-5

7
推荐指数
1
解决办法
439
查看次数

Linq查询的复杂性限制

我是Linq的忠实粉丝,我一直非常享受表达树等的力量.但是我发现每当我试图对我的疑问过于聪明时,我在框架中遇到了某些限制:查询可能需要很短的时间内数据库(如通过性能分析器)上运行,结果拿年龄兑现.当发生这种情况时,我知道我太过花哨了,我开始将查询分解成更小,更小的块 - 所以我有一个解决方案,尽管它可能并不总是最优的.

但我想明白:

  • 在实现查询结果方面,Linq框架在边缘推动的是什么?
  • 我在哪里可以阅读有关实现查询结果的机制?
  • 是否应该避免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)

c# linq linq-to-entities entity-framework

7
推荐指数
1
解决办法
443
查看次数

使用月份确定日期的简单公式?

给定一个标准的调度信息,例如"2009年6月的第二个星期二"或"2009年7月的最后一个星期五",将这个信息转换为日期的最简单,最有效的公式是什么?

输入:

  • w =月份,枚举(第1,第2,第3,第4或最后)
  • d =星期几,星期日到星期六
  • m =月,整数
  • y =年,整数

编辑(再次) - 本周哪一天开始并不重要; 我想在给定的月份得到dw实例.因此,2009年6月的第2个星期日是6月14日,尽管技术上属于6月的第3周; 同样,6月的第一个星期日是6月7日,不是空/例外.

c# datetime calendar formula

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

获取已安装服务的版本信息?

我想以编程方式检查是否安装了最新版本的Windows服务.我有:

var ctl = ServiceController.GetServices().Where(s => s.ServiceName == "MyService").FirstOrDefault();
if (ctl != null) {
  // now what?
}
Run Code Online (Sandbox Code Playgroud)

我在ServiceController界面上看不到任何告诉我版本号的东西.我该怎么做?

c# windows-services

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

如何在ClickOnce应用更新之间保留app.config?

我的ClickOnce应用程序包含一个app.config文件,应用程序根据用户的偏好进行修改.但是,似乎每次我的客户获得应用程序的新版本时,app.config文件都会重置为其原始状态.

有没有办法app.config在ClickOnce更新之间保留文件?

c# clickonce

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

让JNA使用Java => C#?

我在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接口?或者我可以省略我不关心的界面?

欢迎任何示例代码!

c# java jna

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

为什么Assembly.GetType()找不到我的类?

代码摘录:

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存在并正确拼写.

任何其他想法为什么会这样?

c# reflection

6
推荐指数
2
解决办法
4152
查看次数

版本之间的界面变化 - 如何管理?

这是我们在客户网站上遇到的一种相当不愉快的泡菜.客户端有大约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,这是专门为该客户编写的自定义代码.

c# versioning plugins

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

为什么我的ASP.NET MVC应用程序试图导航到login.aspx?

我有一个非常简单的"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)

asp.net-mvc iis-7 asp.net-mvc-4

6
推荐指数
2
解决办法
4845
查看次数

用于引用将Expression返回给另一个方法的方法的语法?

我找到了一段以下形式的代码:

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)

这个的正确语法是什么?

.net c# linq expression expression-trees

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