我遇到了LINQ to SQL的一些特性.
使用相对简单的查询,我想选择一些字段,但将日期字段格式化为字符串,我首先这样做:
var list = dataContext.MyLists.Single(x => x.ID == myId);
var items = from i in list.MyItems
select
new
{
i.ID,
i.Sector,
i.Description,
CompleteDate = i.CompleteDate.HasValue ? i.CompleteDate.Value.ToShortDateString() : "",
DueDate = i.DueDate.HasValue ? i.DueDate.Value.ToShortDateString() : ""
};
Run Code Online (Sandbox Code Playgroud)
后来我尝试了以下查询,这是完全相同的,除了我直接从我的dataContext查询,而不是我的第一个查询中的一个元素:
var items = from i in dataContext.MyLists
select
new
{
i.ID,
i.Sector,
i.Description,
CompleteDate = i.CompleteDate.HasValue ? i.CompleteDate.Value.ToShortDateString() : "",
DueDate = i.DueDate.HasValue ? i.DueDate.Value.ToShortDateString() : ""
};
Run Code Online (Sandbox Code Playgroud)
第一个运行正常,但第二个查询产生一个:
无法将表达式"..."转换为SQL,并且无法将其视为本地表达式.
如果我删除格式化日期的行,它工作正常.如果我删除.HasValue检查它也可以正常工作,直到有空值.
有任何想法吗?
安东尼
我有一个非常大的webapp,它是用MVC构建的.我也将公共代码抽象到一个框架中,该框架位于一个单独的项目中.希望这个框架将在不久的将来用于其他项目.有一些Silverlight应用程序是此框架的一部分,他们的一项工作是一次上传文件块.为了实现这一点,我希望它们与WCF服务进行通信,该服务也存在于框架项目中.我遇到了这个问题.
我将添加到我的框架项目中的app.config数据VS2008复制到web.config中,但这似乎没有用.
经过一些搜索,我发现你可以通过创建一个.svc文件和一个匹配的.cs文件编写一个带有代码的服务,所以我尝试创建MyService.svc,如下所示:
<% @ServiceHost language="C#"
Service="MyFramework.MyService"
%>
Run Code Online (Sandbox Code Playgroud)
由于我的服务存在于另一个项目中,因此没有代码可以引用文件,所以我假设Namespace.Class引用就足够了.
我还将MyService.svc/{*pathInfo}添加到Global.asax文件中的Ignored Routes.
但是,当我尝试浏览localhost:x/MyService.svc时,或者当我尝试使用VS2008中的"添加服务"工具查找服务时,它似乎只是挂起.
我究竟做错了什么?
安东尼
我们这里有两台Win2k3服务器,一台是域控制器,另一台是我们的Web服务器。
我正在将ASP.NET MVC Web应用程序设置作为Web服务器上IIS中的网站运行。
我已经将x86远程调试工具复制到Web服务器,登录到管理员帐户并运行msvsmon。我将我登录到工作站的用户添加到了权限列表中。
在VS2008中打开了Web应用程序项目,然后转到附加到流程,这是我的设置:
Transport: Default
Qualifier: OURDOMAIN\AdminUsername@OURWEBSERVER
Attach To: Managed Code
Selected: w3wp.exe
Run Code Online (Sandbox Code Playgroud)
单击“ 附加”后,窗口会闪烁几秒钟,然后我得到:
Unable to attach to the process. Access is denied.
Run Code Online (Sandbox Code Playgroud)
我尝试右键单击msvsmon并使用“运行方式”以与我登录到我的计算机相同的帐户运行它,但仍然没有区别。
但是,如果我将“ 附加到”字段更改为“ 自动:本机代码”,它可以很好地附加,但是我无法调试任何托管的.NET代码。
这让我感到困惑-有什么想法吗?
安东尼
我正在使用Azure表存储来记录来自我的MVC应用程序的访问者信息,但它有时会引发以下异常:
[WebException: The remote server returned an error: (409) Conflict.]
System.Net.HttpWebRequest.GetResponse() +1399
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync(RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:677
[StorageException: The remote server returned an error: (409) Conflict.]
Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync(RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Executor\Executor.cs:604
Microsoft.WindowsAzure.Storage.Table.TableOperation.Execute(CloudTableClient client, CloudTable table, TableRequestOptions requestOptions, OperationContext operationContext) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Table\TableOperation.cs:44
Run Code Online (Sandbox Code Playgroud)
这似乎发生在我第一次访问网站一段时间不活动后,然后当我点击刷新,页面加载,从那时起的每次点击都很好.
以下是导致异常的代码部分:
var visit = new TrackerVisitEntity(id, url, referer);
var insertOperation = TableOperation.Insert(visit);
_table.Execute(insertOperation);
Run Code Online (Sandbox Code Playgroud)
更新
正如下面的注释和两个答案所述,问题是有时页面连续快速加载两次,我使用GUID(用户独有)作为分区键,当前日期时间作为行键,这会导致重复的实体并导致异常.
虽然Amor的回答更加深入,但Dogu的简单解决方案就是我使用过的,所以我标记了他的正确答案.感谢大家.
我有一个UserControl我已经添加了一个依赖属性:
public partial class WordControl : UserControl
{
// Using a DependencyProperty as the backing store for WordProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty WordProperty =
DependencyProperty.Register("WordProperty", typeof(string), typeof(WordControl), new FrameworkPropertyMetadata("", OnWordChange));
public string Word
{
get { return (string)GetValue(WordProperty); }
set { SetValue(WordProperty, value); }
}
Run Code Online (Sandbox Code Playgroud)
当我在XAML中手动设置Word属性时,哪个工作正常:
<WordGame:WordControl Word="Test"></WordGame:WordControl>
Run Code Online (Sandbox Code Playgroud)
但是,我想将此UserControl用作ListBox的Item Template的一部分,并使用Data Binding来设置单词:
<ListBox Name="WordList" IsEnabled="False" IsHitTestVisible="False">
<ListBox.ItemTemplate>
<DataTemplate>
<Grid>
<WordGame:WordControl Word="{Binding}"></WordGame:WordControl>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
运行时会出现以下错误:
无法在"WordControl"类型的"Word"属性上设置"绑定".'绑定'只能在DependencyObject的DependencyProperty上设置.
由于UserControl继承自DependencyObject,我只能假设问题在于DependencyProperty,但没有任何数量的Google搜索找到了答案.
有任何想法吗?
使用NHibernate构建了大部分DAL后,我现在发现在我的HBM文件中也需要考虑SQL Server的Cascade On Delete规则.我一直在为我的所有收藏品使用包,但似乎没有办法将一个cascade ="delete"属性添加到包中.我可以将所有行李更改为套装,但这似乎意味着我已将我模型上的所有IList <>更改为PersistentGenericSet <> s,我并不喜欢这样做.
有什么建议?
安东尼
我正在编写一种服务,它有五种不同的方法,可能需要5秒到5分钟才能运行.
该服务将安排这些不同的方法以不同的间隔运行.
我不希望任何方法同时运行,所以我如何检查方法是否正在运行并在其完成时将自己排队运行?
安东尼
在过去的几个月里,我一直在使用Linq到NHibernate开发一个webapp,但是直到现在还没有描述它生成的SQL.使用NH Profiler,现在看来,当执行Linq表达式时,下面的代码块会使DB超过3,000次.
var activeCaseList = from c in UserRepository.GetCasesByProjectManagerID(consultantId)
where c.CompletionDate == null
select new { c.PropertyID, c.Reference, c.Property.Address, DaysOld = DateTime.Now.Subtract(c.CreationDate).Days, JobValue = String.Format("£{0:0,0}", c.JobValue), c.CurrentStatus };
Run Code Online (Sandbox Code Playgroud)
存储库方法如下所示:
public IEnumerable<Case> GetCasesByProjectManagerID(int projectManagerId)
{
return from c in Session.Linq<Case>()
where c.ProjectManagerID == projectManagerId
select c;
}
Run Code Online (Sandbox Code Playgroud)
它似乎首先运行初始Repository查询,然后遍历所有结果检查以查看CompletionDate是否为null,但是首先发出查询以获取c.Property.Address.
因此,如果初始查询返回2,000条记录,即使其中只有五条没有CompletionDate,它仍会触发SQL查询以返回2,000条记录的地址详细信息.
我想象的方式可行,是它会评估所有WHERE和SELECT子句并简单地合并它们,因此初始查询将如下:
SELECT ... WHERE ProjectManager = @ p1 AND CompleteDate IS NOT NULL
哪个会产生5个记录,然后它可以触发另外5个查询来获取地址.我在这里期待太多,还是我只是做错了什么?
安东尼
我正在使用NHibernate 3.2,我有一个存储库方法,如下所示:
public IEnumerable<MyModel> GetActiveMyModel()
{
return from m in Session.Query<MyModel>()
where m.Active == true
select m;
}
Run Code Online (Sandbox Code Playgroud)
哪个按预期工作.但是,有时当我使用这种方法时,我想进一步过滤它:
var models = MyRepository.GetActiveMyModel();
var filtered = from m in models
where m.ID < 100
select new { m.Name };
Run Code Online (Sandbox Code Playgroud)
其中产生与第一个相同的SQL,第二个过滤器和选择必须在事后完成.我认为LINQ中的重点是它形成了一个表达树,在需要时它被解开,因此可以创建正确的作业SQL,从而节省了我的数据库请求.
如果没有,这意味着我的所有存储库方法都必须准确地返回所需的内容,并且我不能在不受惩罚的情况下进一步使用LINQ.
我弄错了吗?
更新
响应下面的评论:我省略了迭代结果的行,这导致初始SQL运行(WHERE Active = 1),第二个过滤器(ID <100)显然在.NET中完成.
另外,如果我用第二块代码替换
var models = MyRepository.GetActiveMyModel();
var filtered = from m in models
where m.Items.Count > 0
select new { m.Name };
Run Code Online (Sandbox Code Playgroud)
它生成初始SQL以检索活动记录,然后为每条记录运行一个单独的SQL语句,以找出它有多少项,而不是像我期望的那样写一些东西:
SELECT Name
FROM MyModel m
WHERE Active = 1
AND …Run Code Online (Sandbox Code Playgroud) 我正在从将多个虚拟机的应用程序实例托管到Azure中的多个WebApp.我还有一个批处理工具,我在计划的不同时间运行以执行不同的工作.它所做的特定工作由命令行参数控制,使用Windows任务计划很容易.
在运行WebJob时似乎没有办法指定参数,但我确实找到了以下SO文章,建议使用包含参数的Powershell脚本:
优秀的解决方案,将解决我的问题.但是,当上传包含我的应用程序,相关dll和PowerShell文件作为WebJob的zip时,似乎没有办法指定我想将powershell文件用作WebJob,而是使用exe代替.
我有一个在 XML 中映射的父/子关系。一个 Booking 可以有很多付款,所以我的 Booking 模型有一个 IList Payments {get;set;} 属性,我将它映射到 XML 中,如下所示:
<bag name="Payments" inverse="true">
<key column="BookingId"/>
<one-to-many class="Payment, NHibernateOneToMany"/>
</bag>
Run Code Online (Sandbox Code Playgroud)
这很好用,但现在我需要引入软删除的概念,所以我在 Payment 中添加了一个 Deleted bool 列,我希望 Payments on Booking 只包含未删除的,所以我想做像这样:
<bag name="Payments" inverse="true">
<key column="BookingId"/>
<one-to-many class="Payment, NHibernateOneToMany"/>
<sql>SELECT * FROM Payment WHERE Deleted = 0 AND BookingId = bookingId</sql>
</bag>
Run Code Online (Sandbox Code Playgroud)
我已经研究过使用过滤器,但它们似乎只提供在启用的情况下使用过滤器的能力 - 我希望这个属性每次都排除所有已删除的项目,这样就不会出现错误。
实现这一目标的最佳方法是什么?
nhibernate ×4
linq ×3
asp.net-mvc ×2
azure ×2
c# ×2
.net ×1
asp.net ×1
binding ×1
debugging ×1
linq-to-sql ×1
orm ×1
silverlight ×1
wcf ×1
wpf ×1